Git教程I

  • 本地Git
    • 创建git仓库
    • 将修改存到暂存区
    • 将暂存区提交到当前分支
    • 查看提交历史
    • 回退版本
    • 恢复到更晚的版本
    • 创建新分支
    • 切换分支
    • 简单的分支合并
    • 冲突分支合并
    • 不使用fast forward: –no-ff
  • 远程Git
    • 连接远程仓库
    • 将本地分支上传到远程仓库
    • 从远程仓库拉取

本地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。如果远程仓库领先于本地,那么拉取就能直接成功。否则可以参考冲突合并。