Git教程I
本地Git
学习如何使用本地Git。
创建git仓库
git init
可以在当前位置创建一个git仓库。
也可以用git clone
创建并克隆一个远程仓库。
将修改存到暂存区
假设你添加/修改/删除了文件a.cpp。可以用git status
来看你的电脑在修改了哪些内容。untracked就是还没有存在暂存区的。
可以用git add a.cpp
来将这个修改添加到暂存区。这之后再用git status就能看到已经存了。
将暂存区提交到当前分支
当前分支就是现在所在的分支。默认创建后是master或main。你总是在某一个分支上。
用git commit -m 'NIHAO'
来将暂存区内容提交到当前分支。
查看提交历史
多次进行"修改-add-commit"后,你就已经多次commit了。现在可以用git log
来看每次commit。每次commit有commit、Author、Date等信息。"commit"后的十六进制数是这个commit的编号。一次commit也就是一个版本。
可以用git blame a.cpp
查看一个文件的改变历史。
回退版本
用git reset --hard 12345ab
来回退到以12345ab开头的编号的commit版本。这会修改你的电脑里相应的文件。
commit编号至少填前四位。
恢复到更晚的版本
刚才我们学习了如何回到更早的版本。那么如何回到更晚的版本?
同样用git reset --hard ...命令就可以了。
如果不知道版本commit编号,可以用git reflog
查看commit对应的编号(在该行的开头)。
创建新分支
每次commit可以视为一个树上的节点,随着commit的进行,一根树枝在不断生长。我们也可以在一个节点创建一个新分支。这之后,我们可以切换到这个分支上,在这个分支上生长,同时其它分支没有改变。
用git branch apple
来创建一个名为apple的分支(这时还没有切换过去)。
切换分支
用git checkout apple
来切换到apple分支。同样,也可以git checkout master切换回来。
用git branch
查看现在有的所有分支,以及当前在哪个分支。
切换分支之后,电脑里的文件也会相应修改。
简单的分支合并
假设你在某个版本A切换到了新分支apple,并在这上面提交了一些版本。那么现在apple就领先master若干个版本。
如果想让master追上apple,可以先切换到master分支,然后git merge apple
就行了。
如果想删除apple分支,可以用git branch -d apple
。
一定要注意的是,这种分支合并只用于merge到的分支是另一个的后代的情况,git会使用fast-forward模式。
如果你merge了一个更落后的分支(即祖先节点),那么什么也不会发生。
冲突分支合并
如果你merge了一个既有落后也有领先的分支(即既不是祖先也不是后代),那么就不能fast-forward合并。这时merge的话,会进入MERGING模式,你可以在命令行上面看到。
可以用git status
总览合并与冲突的情况。有些文件是both modified,也就是说它在两个分支里做了不同的修改。
现在查看电脑里的both modified文件,其内容被改为了类似diff结果的格式。
事实上,这也相当于untracked modified文件。我们在把它修改成想要的内容后git add就可以commit了。commit之后,MERGING模式也结束了。
可以使用git mergetool
来修改文件。这里介绍vimdiff的使用方法:聚焦于下方窗口,这个是最后保存的文件。用]c
命令定位到不同之处。用:diffg l
来采用本地的方案(在屏幕左上方窗口的),:diffg r
采用远程方案(屏幕右上方窗口),:diffg b
采用base方案(屏幕正上方的)。也可以自己修改调整。最后:wqa
全部保存退出。
现在可以用git log --graph --pretty=oneline
来看分支合并的示意图。
不使用fast forward: --no-ff
合并到后代时,如果想保持自己的分支和后代分支不在一个节点上,可以加上--no-ff
参数。这会新建一个commit,可以用-m
参数指定提示信息。这么做的效果看起来像自己先提交了一个没有修改的commit,然后冲突合并(且完全采用)后代。
远程Git
学习如何使用远程Git。
连接远程仓库
git remote
命令可以显示远程仓库。如果是用git init创建的本地仓库,那么应该还没有连接,什么也不会显示。
用git remote add grape git@github.com:myjs999/gittest.git
来连接到一个存在的GitHub仓库。你也可以连接到别的仓库。grape是本地的一个远程仓库的代号,你也可以改成别的名字,比如origin。
将本地分支上传到远程仓库
假设本地有已经commit的分支。
用git push grape
来将当前分支上传到远程仓库。会在远程仓库自动创建同名分支。
如果远程仓库已经有这个分支,那么只要本地版本领先于远程版本,上传就能成功。
从远程仓库拉取
git pull grape apple
可以将远程仓库的apple分支内容拉取到当前分支。这相当于做了一次merge。如果远程仓库领先于本地,那么拉取就能直接成功。否则可以参考冲突合并。