学自-learngitbranching-这个网页
Rebase
这里有一张图片:
Rebase 其实理解起来就是, 将一个分支的所有工作, 以另一个分支为起点提交. git rebase [一个分支名]
, 这里选取的分支就是作为新的起点.
Detach HEAD
为什么叫 Detach 呢? 因为 HEAD 和分支分离了, 指向了一个 commit.
Relative refs
通过提交的相对位置来移动 HEAD 指针, 而不是用 Hash 值.
- 向上一次用
^
- 向上多次用
~<num>
如:
1 |
|
用 HEAD 指针退回:
1 |
|
强制一个 branch 移动:
1 |
|
main 会回退到 HEAD 指针的 3 次提交前.
Reverse Changes in Git
两个方法:
- reset
- revert
git reset
, 用于 local, 其实就是回退, 如 git reset HEAD~3
.
git reverse
用于 remote, 这个命令会生成一个新的 branch 来介绍改变的内容.
Git Cherry-pick
看命令的名字就知道, 我们当前 HEAD 所在分支想要获取其他 commit 的内容, 比如 c2, c4, 那么:
1 |
|
就会让 HEAD 所在分支前进两步, 获取 c2 和 c4 两次 commit 的内容.
Git Interactive Rebase
也就是使用 git rebase
的 -i
选项.
如:
1 |
|
HEAD 指针就会以前第 4 次提交为 base, 然会会用 vim (或者其他) 打开一个界面, 选择刚才越过的四个里面哪些 commit 是需要的. 在你把某些 commit 选择为需要后则会在这个 base 上合并前进.
还可以调整 commit 的顺序等.
git commit --amend
可以追加提交.
Git Tags
不能 checkout 一个 tag 然后在上面工作 (意思是 branch 的名字不是叫 tag). 若要给 c1 添加一个 v1 的 tag:
1 |
|
可以利用 tag 跳转.
Git Describe
git describe
这个命令可以描述, 某一个 commit 距离其最近的 tag 的一些相关信息, 如相隔多少个 commit, 以及这一个 commit 的 hash 值.
Specifying Parents
Git Remote Branches
拉去下来的分支称为远程分支. 名称格式为 <remote name>/<branch name>
, 远程分支只有远程仓库更新了才会更新, 不然不会移动, 移动的只是 HEAD.
Git Fetch
git fetch
这个命令可以更新远程分支. 但不会更改 local 的状态.
Git Pull
git pull
命令不仅跟新远程分支, 还会将其和 local 的分支 merge.
Simulating colaboration
git fakeTeamwork
假设远端跟新, 可以指定 branch name 和 commit 个数:
1 |
|
Git Push
git push
不加参数, 所依据的是 push.default
的内容. 且本地的远程分支也会更新.
Diverged Work
git pull --rebase
相当于先 fetch
然后再 rebase
. 其以远程分支的节点为 base.
Remote Rejected
local 更改的起点和 remote 不同.
即遇到 ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)
这种报错.
Mergin feature branches
将 feature 分支内容 merge 到 main 分支中.
Remote-Tracking branches
默认情况下, git pull
之后 main 分支会移动.
Push Arguments
格式为 git push <remote> <place>
<place> Argument Details
将 local 上的一个 branch 提交到 remote 上的不同 branch.
1 |
|
Git fetch arguments
如:
1 |
|
设置和更改 remote tracking, 使用 git branch -u o/main foo
就设置 foo 来 track o/main