Git的状态转换


         最近公司用Git来管理代码,用起来是要比svn爽一些。就是刚接触的时候比较痛苦,特别是那些状态(版本的提交/合并/回退),差点把我搞晕了。现在回过头来总结一下,就清晰多了。

         就本地仓库来看,Git可以分成5个不同的状态,可以通过$ git status来查看。这五个状态可以互相转换,具体操作详见下面的“版本回退/整合”。

         当然,有些文件很有用,不能删除又不能提交,如Eclipse的项目文件. project等。这种情况最好就是选择把他们忽略掉,可以通过修改根目录的.gitignore文件,或者update-index来忽略掉。

status

         显示Git的版本管理信息:$ git status

一般分成3个区域:

a)  Changes to becommitted:暂存区中有修改的文件,但还没commit;

b)  Changes notstaged for commit:工作区中已跟踪且有修改的文件,但还没add;

c)  Untrackedfiles:工作区中未跟踪文件,未纳入Git的管理,每个新建的文件都属于这种。

Git的状态转换_第1张图片

         从上面也能看出很多操作的提示。

[Changes notstaged for commit]和[Untracked files]都可以通过add把文件添加到[Changes to be committed]。

另外,还可以使文件消失在Git的监控范围(ignore掉),这样status就看不到了。

         也可以使用简略的显示模式:$ git status –s

版本回退 / 整合

         根据之前工作区/暂存区/版本库的状态跳转图,可知道回退也是有多种情况。

 Git的状态转换_第2张图片

a)     Untrack区回退

         Untrack区存放的是没有纳入Git跟踪的文件,如新创建的还没add的文件。一般Git是不会理会这部分文件的,如果你嫌碍眼,可以通过clean来清楚他们:

         先通过$ git clean –n查看要会清楚的文件,然后把n去掉,清除。也可以在后面指定文件名,文件-f,目录-d

b)     工作区回退

         $ git checkout -- XXX意思是,把XXX文件在工作区的修改全部撤销:先检查暂存区有没有XXX,如果有则把工作区的XXX恢复到暂存区的状态;如果没有,则到版本库取。

         $ git checkout . 撤销全部工作区的修改。这个命令其实挺危险的,一执行记录都被恢复了,修改都被丢弃了。也可以用$ gitcheckout HEAD XXX,回退暂存区和工作区。

c)      暂存区回退

         面的checkout --只是撤销工作区的文件修改,如果我们想撤销暂存区的,就需要使用$ gitreset HEADXXX,它会把暂存区的记录清空掉。我们通过$ git status就能看到Changes to be committed的内容都跑到Changes notstaged for commit中去了。

也可以用$ git checkout HEAD XXX,回退暂存区和工作区。

         对于暂存区来说,这种方式和commit都会清空记录,前者直接清空,后者先往版本库写,再清空。

d)     版本库回退

         如果你不小心把脏内容commit到本地master了,上面两种方式就无效了,这时候需要回退版本库:$ git reset--hardHEAD^

         在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,也可以写成HEAD~2。你可以用HEAD后面加n个^,或者HEAD~n来表示回退多少个版本。

         上面是相对版本的reset,当然也可以指定某一个具体版本,这时候commitID版本号就大派用场:  $ git reset --hard3628164

3628164只是版本的前一小部分,Git会帮我们去自动匹配,当然也有可能找到多条,所以还是写全比较靠谱。

 

         其实对于Git来说,HEAD是一个当前版本号的指针,用reset来切换版本,实际上是调整HEAD的指向。

Git的状态转换_第3张图片

         所以,如果你reset 到HEAD~10,还行又回去原来的HEAD,那么也可以通过【reset+ 版本号】的方式切换过去。

         当然你要知道对应的版本号,这时候你可以通过 $ git relog 来查看你的命令历史和相对应的版本号

 

e)     远程版本回退

         Git是分布式版本控制系统,只要你把内容push出去了,那么远程库就会有记录,你也不能主动修改别人的版本,这时候就只能覆盖了。但是你干过的坏事也就公诸于世了。

 

回退merge

         如果只是在merge,则可以直接回退: $ git reset--hard HEAD^

         如果merge 以后还有别的操作和改动,则可以使用revert:

$ git revert -m merge线的编号  (从1开始计算,或者merge前的版本号)

 

★ 版本整合

         东西已经commit了,但是又想修改,怎么办呢?可以通过上面“版本库回退”的方法来实现:resetcommit,但是那样commit的修改就没有了,需要重新修改,工作量大。

         所以除此之外,我们还可以:

l  如果只是合并已commit的版本:$ git rebase -i HEAD~2

l  如果有补充的修改$ git commit --amend

你可能感兴趣的:(git,git,status,状态转换)