今天无意中看到据说是Git入门教程 http://www.linuxidc.com/Linux/2014-09/107300.htm,看完后又学到了不少新东西,把自己学到东西总结并记录下,否则总觉得少了些什么东西。下面用一张图来说明工作区(working directory)、版本库(Repository)、暂存区(stage),以及分支的概念。 下面解释不是完全严谨,请结合上图来理解下面四个概念。 工作区(working dicrectory):包含.git目录的父目录一般就是工作区,就是我们的工程目录。新创建的文件都处于工作区,此时还没有加入到后面要解释的的暂缓区。版本库(Repository):.git目录就是版本库,版本管理的相关文件都在此目录下。暂缓区(stage):对于曾经加入了版本控制的文件作了修改后,执行git add后的文件就进入暂缓区。分支:git初始会默认创建一个master分支,执行git commit后,暂缓区的文件就到了分支里面。如下有一个readme.rst文件是已经加入了版本库的,现在对内容进行修改后,查看下状态E:Usersliuzhijunworkspacelog>git status# On branch master# Your branch is ahead of "origin/master" by 4 commits.# (use "git push" to publish your local commits)## Changes not staged for commit:# (use "git add <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working d## modified: README.rst#no changes added to commit (use "git add" and/or "git commit -a")git提示README.rst已经修改了,但还不是暂缓区的文件(not staged),待commit。接着还告诉你可以进行怎么的操作,checkout指撤销本次修改,注意后面有--,如果不带这个字符,checkout又是另外一层意思了。
退回到指定版本
退回到指定版本使用命令git reset --hard <version>, HEAD始终指向当前版本,HEAD^^表示上一个版本。如果想退回到上一个版本就可以使用:git reset --hard HEAD^^如果想退回到指定的某个版本呢?可以使用git log查看获取commit 版本号:commit 33b351ae746edaf3fd5a56a0318235096b6ed1ceAuthor: liuzhijun <lzjun567@gmail.com>Date: Sat Mar 15 11:43:56 2014 +0800commit many filescommit 86eefaaea5251fa5707ecd02009c893c098ab6cdAuthor: liuzhijun <lzjun567@gmai..com>Date: Thu Mar 14 03:20:27 2013 +0800add author myselfcommit 后面的那串就是版本号, 一般只要选择前面几位就可以了。git会自动去查找。git reset --hard 86eefa执行上面的命令就是退回到指定的版本,如果现在我又反悔了,想恢复到最近的那个版本怎么办?只要你还记得这个最近的版本号的话直接执行如上的命令就好了,但是谁会去记这个号啊?那么还有一个办法是使用git reflog查看,这个指令记录了每次的操作。E:Usersliuzhijunworkspacelog>git refloga11c917 HEAD@{0}: reset: moving to a11cHEAD@{1}: reset: moving to HEAD^HEAD@{2}: reset: moving to a11c917430050a94549e48d205ef01cacc82c1cfHEAD@{3}: reset: moving to HEAD^上面的allc...就是我最近的一次修改。
撤销是指文件修改后,还没有添加到暂缓区(还没有执行git add)过程中的修改撤销掉,如果已经添加到了暂缓区,但是还没有commit到分支中去,又做了修改后又想撤销,那么这里的撤销就是撤销到暂缓区的状态。比如现在对文件添加内容"add some to file":E:Usersliuzhijunworkspacelog>git status# On branch master# Your branch is ahead of "origin/master" by 4 commits.# (use "git push" to publish your local commits)## 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: README.rst然后把它添加到暂缓区:git add README.rst再添加内容 "add some again to file",撤销后,你会发现第一次添加的内容保留了,第二次添加的内容撤销了。E:Usersliuzhijunworkspacelog>git checkout -- README.rstE:Usersliuzhijunworkspacelog>git status# On branch master# Your branch is ahead of "origin/master" by 4 commits.# (use "git push" to publish your local commits)## Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: README.rst
如果不同的人对同一个文件的同一个地方做了修改,那么提交后就会遇到冲突,或者在不同的分支上修改了同一个文件的同一个地方也会出现冲突,当出现冲突了,就必须手动把有冲突的地方修改后再提交才能解决冲突。创建分支dev,然后添加内容"add new branch dev",commit后切换到master分支,在同一行添加内容"may be here is conflict",commit后合并。git checkout -b devgit add README.rstgit commit -m "add new branch"git checkout mastergit add README.rstgit commit -m "add new line"git merge dev#出现错误Auto-merging README.rstCONFLICT (content): Merge conflict in README.rstAutomatic merge failed; fix conflicts and then commit the result.README.rst内容出现了如下情况:<<<<<<< HEADmay be here is conflict=======add new branch dev >>>>>>> dev<<<<<<< 到=======表示当前分支的内容, >>>>>表示dev里面的内容。手动修改里面的内容后再提交。那么master就是最新的文件了。当然dev还是停留在上次commit的状态。此时你可能会想,我想在dev分支上与master保持同样的最新状态,那么你可以这样:git checkout devgit rebase master相当于快速的把dev分支指向master。