learn git branch学习了一些git命令,并且成功把小伙伴带坑里了。

某人的要求下写了笔记,那就从最基础的命令开始记录了。我觉得,这里只是让你了解这些命令的存在,需要结合具体运用,比如,真正在提交commit的时候,需要写上提交注释才能push。

以下

基础篇-git主要命令

1.提交记录 git commit

git commit -m "提交备注"

2.创建分支 git branch

git branch newImage

创建分支,指向的还是原来的提交记录。所以如果要切换到新的分支上,需要执行git checkout <name>命令:

git checkout newImage

有个更简洁的方式:如果你想创建一个新的分支同时切换到新创建的分支的话,可以通过 git checkout -b <new-branch-name> 来实现。

git checkout -b newImage

3.合并分支 git merge

我们新建一个分支,在其上开发某个新功能,开发完成后再合并回主线。第一种方法 —— git merge <name>。在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。

在master分支上,把bugFix合并到master上:

git merge bugFix

master 分支合并了bugDix提交记录,但 bugFix 没有master分支记录。下面咱们让它也合并一下:

git checkout bugFix;
git merge master

4.合并分支-2 git rebase

在bugFix分支上,把bugFix分支rebase到master上:

git rebase master

这样,bugFix分支上就有了master的内容,现在 master 还没有更新,我们切换到了 master 上。把它 rebase 到 bugFix 分支上:

git checkout master
git rebase bugFix

高级篇-git特性

1.分离head

HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。

HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。

HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。

在命令执行之前的状态如下所示:

HEAD -> master -> C1

HEAD 指向 master, master 指向 C1

git checkout C1

执行后变成了 HEAD -> C1

如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向。

2.相对引用(^)

通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。

使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算。

两个简单的用法:

使用 ^ 向上移动 1 个提交记录

使用 ~ 向上移动多个提交记录,如 ~3

首先看看操作符 (^)。把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的父提交。

所以 master^ 相当于“master 的父节点”。

master^^ 是 master 的第二个父节点。

git checkout master^

你也可以将 HEAD 作为相对引用的参照。下面咱们就用 HEAD 在提交树中向上移动几次。

git checkout C3
git checkout HEAD^

3.相对引用2(~)

强制修改分支位置,使用git branch -f master HEAD~3命令,将master分支强制指向HEAD的第3级父提交

git branch -f master HEAD^

将master分支强制指向相对于HEAD的父节点上

4.撤销变更

主要有两种方法用来撤销变更 —— 一是 git reset,还有就是 git revert

git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

git reset HEAD^

把 master 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。

虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!

为了撤销更改并分享给别人,我们需要使用 git revert。

git revert HEAD

移动提交记录-自由修改提交树

1.git cherry-pick

如果你想将一些提交复制到当前所在的位置(HEAD)下面的话, 当你你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时,Cherry-pick 是最直接的方式了.

命令形式为:git cherry-pick <提交号>...

抓取其他分支上的提交记录,放到当前分支下:

git cherry-pick c1 c2

2.交互式rebase

但是如果你不清楚你想要的提交记录的哈希值,可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了。

交互式 rebase 指的是使用带参数 –interactive 的 rebase 命令, 简写为 -i

如果你在命令后增加了这个选项, Git 会在Vim 中打开一个文件并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

杂项

1.只取一个提交记录

git rebase -i master //打开master提交之下的所有提交去pick你想要的提交新建一个新的分支。
git rebase bugFix master  //把 master 移到修改的最前端。指向master,原来是指向bugFix

2.提交技巧#1

当你之前在 newImage 分支上进行了一次提交,然后又基于它创建了 caption 分支,然后又提交了一次。

此时你想对的某个以前的提交记录进行一些小小的调整。比如设计师想修改一下 newImage 中图片的分辨率,尽管那个提交记录并不是最新的了。

我们可以通过下面的方法来实现提交修改:

先用 git rebase -i 将提交重新排序,然后把我们想要修改的提交记录挪到最前 然后用 commit –amend 来进行一些小修改 接着再用 git rebase -i 来将他们调回原来的顺序 最后我们用git rebase <目标分支> 把 master 移到修改的最前端。

3.提交技巧#2

用git cherry-pick <提交hash>的方式

4.git tag

5.git describe

高级话题

1.多次rebase

2.两个父节点

3.多分支

push & pull 远程仓库

1.git clone

2.远程分支

3.git fetch

4.git pull

5.团队合作

6.git push

7.偏离的提交历史

远程仓库高级操作

1.推送主分支

2.合并远程仓库

3.远程追踪

4.git push 的参数

5.git push 的参数2

6.git fetch 的参数

7.没有source的source

8.git pull 的参数