Git基础指令

以下内容来自Learn Git Branching

0.常用小指令

粘贴代码到git,shift+insert

1.Git主要命令

提交分支

1
git commit

新建分支

1
git branch bugFix

切换到该分支

1
git checkout bugFix

合并分支

1.如果你基于主分支master新建了分支dev,再基于dev分支新建了一个分支test,在test分支开发完成后,需要将test合并到dev分支上。此时,先用git branch 查看自己在哪个分支上,然后git checkout dev(切换到需要合并的分支上),最后git merge test(在dev分支上执行这句,意思是将test合并到dev分支上)

首先checkout到main上,然后再

1
git merge bugFix

2.在bugFix分支上使用

1
git rebase main

项目更加线性

2.分离HEAD

main 的基础上继续

1
git checkout C4

相对引用

  • 使用 ^ 向上移动 1 个提交记录
  • 使用 ~<num> 向上移动多个提交记录,如 ~3
    以下代码将HEAD移动到指定的位置
    1
    git checkout bugFix^
1
git checkout bugFix~1

以下代码将指定的brach移动到指定的位置
我使用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交。例如:

git branch -f main HEAD~3

上面的命令会将 main 分支强制指向 HEAD 的第 3 级 parent 提交。

撤销变更

主要有两种方法用来撤销变更 —— 一是 git reset,还有就是 git revert
要完成此关,分别撤销 local 分支和 pushed 分支上的最近一次提交。共需要撤销两个提交(每个分支一个)。
记住 pushed 是远程分支,local 是本地分支 —— 这么说你应该知道用分别哪种方法了吧?

对于本地的撤销

1
git reset HEAD~1

对于远程的撤销
1
get revert HEAD~1

3.自由修改提交树

整理提交记录

从HEAD指向的地方增加C2’ C3’ C4’

1
git cherry-pick C2 C3 C4

交互式的rebase

1
git rebase -i HEAD~4

本地栈式提交

….

提交的技巧

我们可以通过下面的方法来克服困难:

  • 先用 git rebase -i 将提交重新排序,然后把我们想要修改的提交记录挪到最前
  • 然后用 git commit --amend 来进行一些小修改
  • 接着再用 git rebase -i 来将他们调回原来的顺序
  • 最后我们把 main 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!

当然完成这个任务的方法不止上面提到的一种(我知道你在看 cherry-pick 啦),之后我们会多点关注这些技巧啦,但现在暂时只专注上面这种方法。 最后有必要说明一下目标状态中的那几个' —— 我们把这个提交移动了两次,每移动一次会产生一个 ';而 C2 上多出来的那个是我们在使用了 amend 参数提交时产生的,所以最终结果就是这样了。

也就是说,我在对比结果的时候只会对比提交树的结构,对于 ' 的数量上的不同,并不纳入对比范围内。只要你的 main 分支结构与目标结构相同,我就算你通过。

git tag

给c1打上v1的标签

1
git tag v1 c1

git describe

git describe 的​​语法是:

git describe <ref>

<ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会使用你目前所在的位置(HEAD)。

它输出的结果是这样的:

<tag>_<numCommits>_g<hash>

tag 表示的是离 ref 最近的标签, numCommits 是表示这个 reftag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。

ref 提交记录上有某个标签时,则只输出标签名称

4.多次rebase的用法

1
2
3
4
git rebase master bugFix
git rebase bugFix side
git rebase side another
git branch -f master another

返回上个时遇到两个父节点

HEAD~首先回到上一层
^2 会优先选择较新的节点
^ 会优先选择较早的节点

1
git branch bugWork HEAD~^2~

5.远程仓库

克隆代码

1
git clone

远程分支

1
2
3
git commit
git checkout o/main
git commit

一键下载

1
git fetch

git pull

以下两种方式是等价的

1
git pull

1
2
git fetch
git merge o/main

模拟团队合作

1
2
3
4
git clone
git fakeTeamwork 2
git commit
git pull

git push一键上传

1
git push

偏离的提交历史

1
2
3
4
5
git clone
git fakeTeamwork 1
git commit
git pull --rebase
git push

远程服务器拒绝!(Remote Rejected)

如果你是在一个大的合作团队中工作, 很可能是main被锁定了, 需要一些Pull Request流程来合并修改。如果你直接提交(commit)到本地main, 然后试图推送(push)修改, 你将会收到这样类似的信息:

1
! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)
1
2
3
git reset o/main
git checkout -b feature c2
git push origin feature

6.关于origin和它的周边

推送主分支 rebase

1
2
3
4
5
6
git fetch
git rebase o/master side1
git rebase side1 side2
git rebase side2 side3
git rebase side3 master
git push

推送主分支 merge

1
2
3
4
5
6
git checkout master
git pull origin master
git merge side1
git merge side2
git merge side3
git push origin master

远程跟踪,创建一个名为foo的分支跟踪o/main

1
2
git checkout -b foo o/main
git pull

另一种设置远程追踪分支的方法就是使用:git branch -u 命令,执行:
git branch -u o/main foo
这样 foo 就会跟踪 o/main 了。如果当前就在 foo 分支上, 还可以省略 foo:
git branch -u o/main

这边的git pull —rebase会产生c3’,git pull会产生c4

1
2
3
4
git checkout -b side o/master / git branch -f side master
git commit
git pull --rebase
git push

git更新指定仓库

用本地的分支main更新远程仓库origin中的分支main

1
git push origin main

要同时为源和目的地指定 <place> 的话,只需要用冒号 : 将二者连起来就可以了:
git push origin <source>:<destination>
这个参数实际的值是个 refspec,“refspec” 是一个自造的词,意思是 Git 能识别的位置(比如分支 foo 或者 HEAD~1
一旦你指定了独立的来源和目的地,就可以组织出言简意赅的远程操作命令了,让我们看看演示!

1
2
git push origin master
git push origin foo

git pull参数

1
2
git pull origin bar:foo
git pull origin master:side