您的位置:首页 > 其它

git学习和使用(一) 本地版本库的操作

2015-12-15 18:02 459 查看
前几天只是学习了git最简单的使用,今天有时间把廖雪峰老师的git教程直接看完,写点东西加强一下记忆。

git的安装就不赘述了,我的开发环境是mac,直接从头开始,走一遍开发流程,我有一个项目,需要利用git做版本管理,新建一个文件夹 tiansi_git作为工作目录

mkdir tiansi_git


git init命令,初始化git,把该目录设置为git管理的仓库

git init


现在这个目录就纳入git的管理范围内,目录下也多了一个名为.git的隐藏目录,可以通过 ls -al 命令来看到它

➜  tiansi_git git:(master) ls -al
total 0
drwxr-xr-x   3 tiansi  staff   102 12 15 15:27 .
drwxr-xr-x+ 51 tiansi  staff  1734 12 15 15:27 ..
drwxr-xr-x  10 tiansi  staff   340 12 15 15:27 .git


我就是在这个目录底下干活的,git把它叫做工作区,.git目录就是我的本地代码仓库,里面包含一个暂存区和版本库,如何使用git版本库来管理咱们的文件呢,当你在工作区新建,修改文件后,首先运行 git add 命令添加文件,这个命令会把文件添加至暂存区,然后运行git commit 命令,就会把暂存区所有的内容提交到版本库内

整个git版本库工作的流程就是,你工作开发新建,或者更改了文件,然后你提交到暂存区,然后由暂存区提交到版本库。

➜  tiansi_git git:(master) ✗ cat tiansi.txt
git使用
➜  tiansi_git git:(master) ✗ git add tiansi.txt
➜  tiansi_git git:(master) ✗ git commit -m "第一次提交到本地仓库"
[master (root-commit) cec45c5] 第一次提交到本地仓库
1 file changed, 1 insertion(+)
create mode 100644 tiansi.txt


显示一个文件改变,插入一行内容,如果你的文件已提交到本地版本库内

➜  tiansi_git git:(master) git status
On branch master
nothing to commit, working directory clean


git status命令就会告诉你,在主分支,没有文件等待提交,工作区是干净的。现在再次修改这个文件,增加一行内容,第一次修改,并通过git status查看状态

➜  tiansi_git git:(master) ✗ cat tiansi.txt
git使用
第一次修改
➜  tiansi_git git:(master) ✗ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified:   tiansi.txt

no changes added to commit (use "git add" and/or "git commit -a")


提示你tiansi.txt发生了更改,但是并没有提交到暂存区,再次运行命令提交

➜  tiansi_git git:(master) ✗ git add tiansi.txt
➜  tiansi_git git:(master) ✗ git commit -m "第一次修改后的提交"
[master cde7256] 第一次修改后的提交
1 file changed, 1 insertion(+)
➜  tiansi_git git:(master)


利用git log命令可以查看提交日志,它可以看到最近的3次提交

➜  tiansi_git git:(master) git log
commit cde7256152f3c75a894bbdc9567d59bcbaeeffd0
Author: 田斯 <tiansi@uubpay.com>
Date:   Tue Dec 15 16:27:28 2015 +0800

第一次修改后的提交

commit cec45c5b87559070050ad754e4bb9e6e9cd22f3b
Author: 田斯 <tiansi@uubpay.com>
Date:   Tue Dec 15 15:41:11 2015 +0800

第一次提交到本地仓库


如果感觉不直观,加上 –pretty=oneline

➜  tiansi_git git:(master) git log --pretty=oneline

cde7256152f3c75a894bbdc9567d59bcbaeeffd0 第一次修改后的提交
cec45c5b87559070050ad754e4bb9e6e9cd22f3b 第一次提交到本地仓库


log可以直观的看到每次更改的内容,在这里建议每次提交的信息要全面直观,不要怕过长,以便于以后的版本回退

两次的提交,对于git的工作原理有了大概的认识,那么就是不管你新建,修改了什么文件,假如你不通过 git add添加到暂存区,那么就不能通过 git commit 提交到你的版本库,这是一个串行操作

下面继续开发,第二次修改文件,增加内容 小雨伞喜欢装大头蒜

➜  tiansi_git git:(master) ✗ cat tiansi.txt
小雨伞喜欢装大头蒜
git使用
第一次修改


但是我觉得这样写不好,想把这行删掉,那么通过git如何操作呢,使用 git checkout –文件名 命令,它的作用是把这个文件恢复到最近一次git commit或git add时的状态,也可以理解为它会把版本库内最新的一次版本直接覆盖工作区

➜  tiansi_git git:(master) ✗ git checkout -- tiansi.txt
➜  tiansi_git git:(master) cat tiansi.txt
git使用
第一次修改


果然,小雨伞那行内容不见了,它是把文件恢复到你最近一次提交时的状态,假如你加了这条内容之后,顺手add了一下,把它提交到了暂存区呢

➜  tiansi_git git:(master) ✗ cat tiansi.txt
小雨伞喜欢装大头蒜
git使用
第一次修改
➜ tiansi_git git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: tiansi.txt


这会儿需要使用 git reset 命令把文件从暂存区清理掉,大写HEAD指的是版本库内最新的代码版本

➜  tiansi_git git:(master) ✗ git reset HEAD tiansi.txt
Unstaged changes after reset:
M tiansi.txt
➜ tiansi_git git:(master) ✗ cat tiansi.txt 小雨伞喜欢装大头蒜 git使用 第一次修改
➜ tiansi_git git:(master) ✗ git checkout -- tiansi.txt ➜ tiansi_git git:(master) cat tiansi.txt git使用 第一次修改


提示已经把文件清除了,文件恢复到了工作区,这会儿再使用checkout 命令把文件恢复到以前版本

如果你更改了文件,不仅add,而且commit了,已经将文件提交到了代码库,怎么恢复原来的文件呢

➜  tiansi_git git:(master) cat tiansi.txt
小雨伞喜欢装大头蒜
git使用
第一次修改
➜  tiansi_git git:(master) ✗ git add .
➜  tiansi_git git:(master) ✗ git commit -m "增加内容:小雨伞喜欢装大头蒜"
[master d26d7cd] 增加内容:小雨伞喜欢装大头蒜
1 file changed, 1 insertion(+)


使用git的版本回退功能,git reset,首先查看你的commitID,看到最近3次的commit,然后回滚到上次的commit

➜  tiansi_git git:(master) git log --pretty=oneline
d26d7cdfd17fd1bfea53a4801d1f96d69e80e8af 增加内容:小雨伞喜欢装大头蒜
cde7256152f3c75a894bbdc9567d59bcbaeeffd0 第一次修改后的提交
cec45c5b87559070050ad754e4bb9e6e9cd22f3b 第一次提交到本地仓库


找到上一次的commitID 然后使用reset 命令回滚,这里面使用了参数 –hard,

git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息

git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

➜  tiansi_git git:(master) cat tiansi.txt
小雨伞喜欢装大头蒜
git使用
第一次修改
➜  tiansi_git git:(master) git log --pretty=oneline
➜  tiansi_git git:(master) git reset --hard cde7256152f3c75a894bbdc9567d59bcbaeeffd0
HEAD is now at cde7256 第一次修改后的提交
➜  tiansi_git git:(master) cat tiansi.txt
git使用
第一次修改


我们发现,文件变回来了,同样的道理,假如你误操作,把文件删除了

➜  tiansi_git git:(master) rm tiansi.txt
➜  tiansi_git git:(master) ✗ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

deleted:    tiansi.txt

no changes added to commit (use "git add" and/or "git commit -a")


git提示,这个文件被删除掉了,也可以直接使用checkout命令恢复这个文件,跟更改同理

➜  tiansi_git git:(master) ✗ git checkout -- tiansi.txt
➜ tiansi_git git:(master) ls
tiansi.txt
➜ tiansi_git git:(master) git status On branch master nothing to commit, working directory clean


文件同样回来了

如果你真的是想要删除这个文件,使用git rm命令,然后commit即可

➜  tiansi_git git:(master) git rm tiansi.txt
rm 'tiansi.txt'
➜  tiansi_git git:(master) ✗ git commit -m "删除了tiansi.txt文件"
[master 273ffeb] 删除了tiansi.txt文件
1 file changed, 2 deletions(-)
delete mode 100644 tiansi.txt


你会发现,本地和版本库的文件都没有了,如果你想要恢复这个文件,就只能通过刚才说的版本回退 git reset命令了。

关于文件更改,删除,工作区,暂存区,版本库的概念告一段落,下面说一下分支的概念,分支是git强大的功能之一

它可以让你的项目并行开发,每个人各有自己的分支,最后只需要汇总一下,一个完整的项目就出来了。当你初始化git版本库的时候,git会默认建立分支 master,也叫主分支,查看分支命令 git branch

➜  tiansi_git git:(master) git branch
* master


星号代表当前使用分支

下面创建并切换至分支study

➜  tiansi_git git:(master) git checkout -b study
Switched to a new branch 'study'
➜  tiansi_git git:(study) git branch
master
* study


成功创建并且切换至 study分支,这会儿study分支和主分支就等同于双胞胎一样,内容一模一样,现在在study分支下进行开发,增加文件 xiaoyusan.txt并提交

➜  tiansi_git git:(study) ✗ cat xiaoyusan.txt
小雨伞装大头蒜
➜  tiansi_git git:(study) ✗ git add xiaoyusan.txt
➜  tiansi_git git:(study) ✗ git commit -m "提交"
[study 93ed732] 提交
1 file changed, 1 insertion(+)
create mode 100644 xiaoyusan.txt


然后切换回主分支

➜  tiansi_git git:(study) git checkout master
Switched to branch 'master'
➜  tiansi_git git:(master) ls


发现并没有xiaoyusan.txt这个文件,因为那是在study分支上开发的,所以主分支肯定没有,那么如果把两个分支合并呢,git merge 命令,合并指定分支到当前分支

➜  tiansi_git git:(master) git merge study
Updating 273ffeb..93ed732
Fast-forward
xiaoyusan.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 xiaoyusan.txt
➜  tiansi_git git:(master) ls
xiaoyusan.txt
➜  tiansi_git git:(master) cat xiaoyusan.txt
小雨伞装大头蒜


我们发现,xiaoyusan.txt在主分支内也有了,说明合并成功,那么这会儿就可以删除study分支了,因为它的使命已经完成了,删除分支命令为

➜  tiansi_git git:(master) git branch -d study
Deleted branch study (was 93ed732).
➜ tiansi_git git:(master) git branch * master


分支成功删除

然后新问题来了,如果两个分支同时开发,更改的是同一个文件,怎么办呢,创建新分支wait,然后对xiaoyusan.txt文件进行更改并提交到版本库

➜  tiansi_git git:(master) git checkout -b wait
Switched to a new branch 'wait'
➜  tiansi_git git:(wait) ls
xiaoyusan.txt
➜  tiansi_git git:(wait) vim xiaoyusan.txt
➜  tiansi_git git:(wait) ✗ cat xiaoyusan.txt
小雨伞装大头蒜
总是喜欢装大头蒜
➜  tiansi_git git:(wait) ✗ git add .
➜  tiansi_git git:(wait) ✗ git commit -m "增加内容 总是喜欢装大头蒜"
[wait d4f7973] 增加内容 总是喜欢装大头蒜
1 file changed, 1 insertion(+)


然后切换回主分支修改xiaoyusan.txt文件并提交到版本库,然后进行代码合并

➜  tiansi_git git:(wait) git checkout master
Switched to branch 'master'
➜  tiansi_git git:(master) ✗ cat xiaoyusan.txt
小雨伞装大头蒜
酒量不行就爱吹
➜  tiansi_git git:(master) ✗ git add .
➜  tiansi_git git:(master) ✗ git commit -m "在主分支也修改了"
[master cd44991] 在主分支也修改了
1 file changed, 1 insertion(+)
➜  tiansi_git git:(master) git merge wait
Auto-merging xiaoyusan.txt
CONFLICT (content): Merge conflict in xiaoyusan.txt
Automatic merge failed; fix conflicts and then commit the result.


报错,告诉我们xiaoyusan.txt存在冲突,必须手动处理,直接查看该文件

➜  tiansi_git git:(master) ✗ cat xiaoyusan.txt
小雨伞装大头蒜
<<<<<<< HEAD
酒量不行就爱吹
=======
总是喜欢装大头蒜
>>>>>>> wait


Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改后保存,然后再次提交

➜  tiansi_git git:(master) ✗ cat xiaoyusan.txt
小雨伞装大头蒜
酒量不行就爱吹
总是喜欢装大头蒜
➜  tiansi_git git:(master) ✗ git add .
➜  tiansi_git git:(master) ✗ git commit -m "手动合并后的提交"


这会儿两个分支就已经合并了,可以使用git log 命令来查看分支合并,然后删除wait分支

➜  tiansi_git git:(master) git log --graph --pretty=oneline --abbrev-commit
*   f07a364 手动合并后的提交
|\
| * d4f7973 增加内容 总是喜欢装大头蒜
* | cd44991 在主分支也修改了
|/
* 93ed732 提交
* 273ffeb 删除了tiansi.txt文件
* cde7256 第一次修改后的提交
* cec45c5 第一次提交到本地仓库
➜  tiansi_git git:(master) git branch -d wait
Deleted branch wait (was d4f7973).


开发一个新功能,最好新起一个分支,但是假如这个分支做完之后发现没有用怎么办,如果你直接删除它,会报错提示你分支并未合并,那么就只能使用大写D参数来删除它

➜  tiansi_git git:(master) git branch -d new
error: The branch 'new' is not fully merged.
If you are sure you want to delete it, run 'git branch -D new'.
➜  tiansi_git git:(master) git branch -D new
Deleted branch new (was 53cd39e).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: