Git笔记
Published:
git命令行语句
git是一个版本控制软件,如果为了方便使用,可以直接使用github desktop来傻瓜式操作。本章节主要介绍一些常用的命令行控制语句。 每个项目文件夹都是一个git节点,而项目版本迭代使得节点之间产生关联并构成一棵树。git命令能够对这棵树进行操作,包括但不限于创建节点,在某个节点上创建分支等等。 若在某个节点上有两个分支,且对应两个不同的提交记录,则版本迭代树在这个节点上产生分叉。
- git commit: 保存当前文件快照,比对文件的不同处,上传得到一个新的节点。
- git branch: 在当前位置创建一个分支
- git checkout: 切换到一个分支
- git checkout -b
: 创建并切换到一个分支 - git merge: 将选定的分支合并到当前的分支下。从公共的祖先开始,选定的分支的所有改动将被更新在当前的分支下。
- git rebase: 取出当前分支(从分叉的祖先开始)的提交记录,以选定的分支作为base,逐个放下去。
HEAD: 指向当前分支上的最近一次提交记录。可以通过以下方式查看HEAD指向:
cat .git/HEAD
git symbolic-ref HEAD
使用git checkout
git checkout main^
git checkout main~1
以上句子可以将HEAD指向main分支的父节点。甚至我们可以将HEAD作为相对引用的参照。 强制修改分支位置:
git branch -f main HEAD~3
使得main分支指向HEAD的三级父节点。
- git reset HEAD^1: 在本地撤销历史记录,并回退到某个节点。
- git revert: 撤销当前HEAD节点对应的更改,并生成一个新的子节点。新的子节点状态与HEAD的父节点状态应当是相同的。
- git cherry-pick
...: 将某些提交放到**当前节点**所在的位置下面。这种方法的好处在于,如果已知一些提交记录的**哈希值**,就可以直接将提交记录按顺序拷贝过来。 - git rebase -i HEAD^4: 从HEAD的第四个节点开始,以对话框的方式重新排列/删除在它之后提交的记录,并生成一系列的节点。
- git commit –amend: 修改当前的节点(新的commit替代了上一次commit的位置,commit id也变成了新的)
- git tag
: 将标签贴到某个节点上。git checkout可以通过引用标签来实现。
在
git branch -f main HEAD~3
中,如果HEAD后面是^,则它后面的数字k代表的是第k个父节点。
git checkout HEAD~^2~2
表示切换到HEAD的一级父节点的第二个父节点的两级父节点。注意:父节点的次序依赖于merge的次序。
cherry-pick和rebase的不同:rebase是重新连接,而cherry-pick是复制。
git clone是指在本地储存一个远程仓库的复制。本地会出现一个特殊分支【o/main】,当这个分支在本地commit时,如果远程仓库没有变化,则这个分支不会随着commit而移动。
git fetch能够更新本地的数据以同步远程分支。同步之后,本地的【o/main】分支会保持与远程分支的main一致。【o/main】分支本质上反映了远程分支在本地的版本,即最后一次与远程分支通信时的状态。注意:git fetch不会改变本地仓库的状态,并不会修改本地的文件,只是单纯地下载而已。
git pull = git fetch + git merge
git push: 将当前分支的本地更改提交到远程仓库中。 注意:如果远程仓库和本地的版本不一致(远程的main与本地的o/main不一致),则git拒绝推送请求。 git pull –rebase: 将我们的工作rebase到远程分支的最新提交记录。如果本地仓库和远程仓库的指针有冲突,则需要先用git pull –rebase使得本地的提交转移(rebase)到最新的远程版本上。在这之后,就可以使用git push上传了。
- git checkout -b
:使得本地的node1跟踪远程的node2。 - git branch -u
: 使得node2跟踪node1 - git push origin foo: 通过本地的foo分支来更新远程仓库origin。
- git push origin foo^:main: Git将origin远程仓库的main分支更新到本地foo^对应的位置。foo^是起点,main是终点。等同于Git将这一段的树的拷贝更新到远程origin仓库中。
- git fetch origin foo: 从origin仓库中下载foo分支上所有本地不存在的提交,然后放到本地的o/foo上。
- git fetch origin foo~1:bar: 从远程仓库origin直到foo~1的所有节点,下载到本地,并更新/创建本地的bar分支。foo~1是远程节点,bar是本地节点,且bar的时间更早,因此本地下载了从bar到foo~1的节点树。
- git push origin :foo 将删除远程仓库中的foo分支。
- git fetch origin :bar 将在本地创建一个新分支bar。