学习learngitbranching的一些记录。都是关于git分支的操作。我整理的目录和原网站不同,主要是因为这个笔记是作为备忘录。
重要概念
- 注意要区分分支操作和HEAD操作的不同。
分支操作
git checkout -b new_branch
新建并跳转到分支new_branch- 注意合并是分支操作,有
git merge
和git rebase
。 git merge
是非线形合并,保留了提交历史,如果x1继承于x0,命令x0 merge x1
只是把x0移动到了x1,不必做其他修改。如下所示,由C2直接指向了C4:git rebase
可以创造更线性的提交历史,是将次分支合并到主分支上。注意这个操作结束后两个分支的指向位置是不同的,还需要让master指向最新的位置。注意⚠️:次分支此时也指向了主分支,之前的那个次分支是否还存在?不确定。- 分支操作,让分支指向另一个提交
git branch -f master HEAD~3
HEAD操作
git checkout
用来进行HEAD跳转,HEAD既可以指向分支当前位置,也可以指向某个提交记录。- 相对引用:使用
^
向上移动 1 个提交记录;使用~<num>
向上移动多个提交记录,如git checkout HEAD~3
撤销操作
- 撤销更改有两种方式:
git reset
和git revert
。 git reset
向上移动分支,使原来指向的提交记录就跟从来没有提交过一样。注意⚠️:在reset后, 其实所做的变更还在,但是处于未加入暂存区状态。- 但是如果要撤销远程的就只能使用
git revert
。注意⚠️:git revert x
就是指撤销记录x的修改,而不是让它新的指向和x相同。
修改记录
git cherry-pick hbsun_some_hash
将提交(hbsun_some_hash)复制到当前所在的位置(HEAD)下面,可以一次添加多个。应该常见于分支操作。- 交互式操作:
git rebase -i HEAD~4
说明操作
git tag
用来打标签git describe
用来描述离当前HEAD最近的标签。- 操作符
^
后面跟数字用来区分父节点,应用于有多个父节点时的情况。
远程操作
- 注意本地仓库中有一个master,同时也记录了远程的master:origin/master,它们是不同的概念,但是可以对应起来,有时在本地的指向可能并不一致。其他分支同理。
git fetch
并不会改变你本地仓库的状态。它不会更新你的 master 分支,也不会修改你磁盘上的文件。为单纯的下载操作。注意和git pull
区分。git fetch;git merge origin/master
和git fetch;git rebase origin/master
不是完全一样,但是都不如直接git pull
方便。git pull
就是fetch
和merge
的简写,类似的git pull --rebase
就是fetch
和rebase
的简写!pull
命令包含了merge
。- 提交完pr后(一定是新建了其他分支来提pr),最好重置一下master分支和远程保持一致,否则下次pull时可能和其他人的修改有冲突。
git checkout -b totallyNotMaster o/master
: 创建一个名为 totallyNotMaster 的分支,它跟踪远程分支 o/master。或者,git branch -u o/master foo
:本地foo 就会跟踪远程o/master 了。- 本地分支跟踪远程分支,而HEAD不会跟踪远程分支。注意区分概念。
- 删除远程分支:push 空
到远程仓库。 git push origin :foo
- git pull 远程分支前,要切换到真正对应的本地分支;否则,都会将远程仓库merge到本地当前HEAD指的位置:
git pull origin master
即使本地当前分支为other_banch,也会将远程master merge进other_banch里,即使使用source:destination
,也会最后merge到本地当前HEAD指的位置。
常用操作
- 添加远程仓库: ```git remote add origin https://github.com/hbsun2113/***.git``
- github: Large files detected。可以使用如下命令去除大文件,但是注意可能会更改commit号,谨慎使用。
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch XXXX