toc
<img src="https://i.loli.net/2021/10/14/2VkCxGANThj8XJO.png" style="zoom:50%;" />
<img src="https://i.loli.net/2021/10/14/z4QpUq1xCV5nil6.png" style="zoom:50%;" />
<img src="https://i.loli.net/2021/10/14/MYxLgJ9h1HCIND2.png" style="zoom:50%;" />
我们都知道,对一个分支来说。会一直向前走。但是有时候我们在分支上需要一个固定的坐标。就可以使用tag。
当然也可以通过移动Head指针,指向对应的Commit Id,只不过tag做了一个类似alias的功能
这里是git的最底层原理,用来理解其怎么实现,但最重要的开始理解文章最开始的Git基本概念图。
git init
echo "ver1" > file.txt
git add file.txt
git status
Changes to be committed:
new file: file
暂存区新加文件file
git commit -m "first commit"
git commit 根据暂存区文件生成一个tree对象,并用commit链接tree对象。
此时的逻辑图是这样的
<img src="https://i.loli.net/2021/10/14/GeOT1YwzP8IApvb.png" style="zoom:50%;" />
echo "ver2" >> file
echo "new" > new
git add file
git add new
git commit -m "second commit"
此时的逻辑图是这样的
<img src="https://i.loli.net/2021/10/14/J9IcHVCzDOlQGqL.png" style="zoom:50%;" />
git rm new
git commit -m "third commit"
<img src="https://i.loli.net/2021/10/14/ZEUWXaevwFI9JHG.png" style="zoom:50%;" />
git add/rm
git status
git commit
git reset
git restore
git add <file> 将文件提交到暂存区
一旦文件git add后,就相当于被track了,任何对文件的改动都会被git所记录。
git restore --staged <place> 从HEAD中恢复文件到暂存区
git restore <place> 将文件从暂存区恢复到工作区
git restore --source <branch>:<place> 从其他的commit恢复文件
这里的<place> 可以是file,也可以是正则之类的东西
git init
echo "123" > file
git add file
rm file
如何将file恢复。
git restore file
git commit -m "ver1"
echo "error" > file
git add file
rm file
如何恢复commit中的file
git restore --staged file git restore file
如何恢复内容是“error”的file
git restore file
git commit 用来将暂存区的文件提交到本地数据库中。
git commit --ammend
会取消上一次的commit,并合并你暂存区的文件,重新提交一次commit
git reset 用来回退版本
git reset HEAD
git reset --soft <verID>
git reset --mixed <verID> 默认
git reset --hard <verID>
git reset HEAD 默认使用–soft。
reset --soft 本质就是移动了HEAD指针。
git reset HEAD 主要是用来回滚暂存区。
重置暂存区,主要用来roll back
git init
echo ver1 > file
git add file
git commit -m "ver1"
echo ver2 >> file
git add file
git reset HEAD
<img src="https://i.loli.net/2021/10/14/ziEJ5tVhlXmC2qD.png" style="zoom:50%;" />
echo ver1 > file.txt
git add file.txt
git commit -m "ver1"
echo ver2 >> file.txt
git add file.txt
git commit -m "ver2"
echo ver3 >> file.txt
git add file.txt
git commit -m "ver3"
git reset --soft HEAD^
仅仅移动HEAD指针。workspace和staging area都不受影响。
git reset --mixed HEAD^
HEAD 指针移动,同时暂存区也会被回滚到ver2
同时会撤销暂存区,workspace,和local repository。是一个非常危险的命令。
负责将某个commit-id的commit复制到当前分支上。
用来保存暂存区和工作区的文件内容
远程分支的本质上也是一个分支。其就是在本机中远程仓库对应分支的映射分支。
远程分支的名字就是 <repo>/<local-branchname>,一般为origin/<local-branchname>。默认的远程仓库名就是origin。
git push <remote> <place>
1. 将本地分支的所有commit提交到<remote>/<place>分支下,同时更新远程仓库中的对应分支。
git push <remote> <source>:<dest>
1. 同上,但是将本地分支commit提交到<remote>/<dest>分支下,同时更新远程仓库的<dest>分支。
git push <remote> :<dest> 可以删除远程分支
会干俩件事
origin/master
)。git fetch <repo> <place>
<repo> 远程仓库名
<place> 分支名
git fetch
会更新所有分支
git fetch origin foo
下载本地foo分支缺失的commit,然后更新origin/foo指针。
git pull就是在完成git fetch后,会用当前分支merge远程分支。
git merge 可以分为两种情况。1. fast forward 2. 三路合并
<img src="https://i.loli.net/2021/10/14/qwXf2axEPv4KQ9R.png" style="zoom:50%;" />
当前分支master和目标分支feature没有分叉。则可以直接进行fast forward合并。
<img src="https://i.loli.net/2021/10/14/CrpnOyY5ExPflW7.png" style="zoom:50%;" />
<img src="https://i.loli.net/2021/10/14/GrYEejxZps2Nvfb.png" style="zoom:50%;" />
当在master分支,merge feature分支时。
<img src="https://i.loli.net/2021/10/14/4QjrApsFaW2iTxX.png" style="zoom:50%;" />
理解了这个原理后,如何快速造一个confict出来。
git init
echo "hello" > test.txt
git add test.txt
git commit -m "m1"
git switch -c feature
echo "world" >> test.txt
git commit -am "f1"
git switch master
echo "nihao" >> test.txt
git merge feature
Reapply commits on top of another base tip 这里的官方解释很明确
git rebase <upstream> <branch>
1. 如果指定了branch,就会先执行git switch branch,然后执行git rebase
2. 如果没有指定<upstream> ,则默认以本分支的远程分支为upstream
git rebase -i <commit-id>
一般从master中checkout一个新的分支出来
git switch master
git pull master
git switch -c feature/${someone_name}/${feature_name}
一般测试时,是合到experiment分支上去的。
重新checkout一个feature的exp分支出来。
git switch experiment
git switch -c feature/${someone_name}/${feature_name}_exp
git merge feature/${someone_name}/${feature_name}
这么做的原因是因为万一experiment分支有了Bug代码,但不是你提交的。暂时修改不了,可以让自己的${feature_name}_exp
作为测试分支。因为这个分支不会有别人的测试代码。
git commit -m "commit"
git push origin branch_name
这时候发现有个代码写错了,改动了一番后,想使用
git commit --ammend
这时候直接
git push -f origin branch_name
因为commit --ammend会重新生成一个commit id,和远程仓库不一致。
这里不建议新手使用是因为,如果已经把commit1提交到远程仓库,然后通过ammend再去修改,这时候需要push --force,所以只能对自己的分支这么搞,和别人合作时不可以。
通过找到一个commit id。
比如说 git revert -i 1e1f61f8125a1706c98a465287a5c22e15a4cc83
git 算是日常开发中用到的非常重要的工具。建议熟练掌握。
建议完成里面所有的官卡。基本上就对git非常熟悉了。可以大胆地玩了。
https://learngitbranching.js.org/?locale=zh_CN
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。