|
作者:zyugat.cn/zyugat.com
Git 从了解到精通(2)分支管理及代码冲突和Stashing
Git 从了解到精通(1)常用命令
Git 从了解到精通(2)分支管理及代码冲突和Stashing
分支
git pull:拉去更新,自动合并。
git fetch [remote-name]:拉取更新,和不会自动合并到当前工作分支。
git branch --no-merged:查看未合并的分支
git branch --merged:查看已经合并的分支
git branch dev
git checkout dev
git branch -b dev
git branch -m master main
git checkout main
git merge dev
git branch -d dev
git branch
git branch -r
git checkout -b develop origin/develop
merge的问题和 rebase 的用法
例如有两个分支,main 和 dev。
- 情况
- 当有人在 main 分支上**
对分支做出改变**了,会导致 main 和 dev 分支不是一个起点,从而多出了一步合并操作,当发生冲突的时候,就需要管理 main 的人去处理冲突。 - 这不是我们想要的效果,我们想要当发生冲突应该由 dev 分支的管理员去处理冲突。
* 636f97f - (HEAD -> main, dev) merge dev (14 seconds ago) <zyugat>
* ded723d - merge dev (3 minutes ago) <zyugat>
* f2e6d16 - merge dev2 (2 hours ago) <zyugat>
|\
| * 50d9ff5 - (dev2) dev2 change test.txt (3 hours ago) <zyugat>
* | 7725c3c - dev change test.txt (3 hours ago) <zyugat>
|/
rebase
- 使 dev 分支的节点起点,移动到 main 分支的终点。(dev 永远是先于 main 分支的)
- 如果存在冲突则是 dev 人员去处理
git checkout dev
git rebase main
git commit -m "dev news"
git checkout main
git merge dev

reset
使用 reset 恢复到历史提交点,重置暂存区与工作目录的内容
- 参数
--mixed(默认) :回退到 add 的动作。--soft :回退 commit 的动作。--hard :清空工作区和暂存区的改动。
例:
git reset --hard b7b73147ca8d6fc20e451d7b36 恢复到指定提交版本(先通过 git log 查看版本号),重置 stage 区和工作目录里的内容。git reset --hard HEAD^^^ 恢复前三个版本git reset HEAD -- . 撤销暂存区的文件git reset HEAD a.sh 放弃已经 add 暂存区的文件 a.sh
代码冲突
第一步到第四步是部署环境,从第五步开始就是模拟冲突。
git branch dev
git branch dev2
git checkout main
echo "main" >> test.txt
git add test.txt
git commit -m "commit test.txt"
git checkout dev
git merge main
git checkout dev2
git merge main
git checkout dev
echo "dev change test.txt" >> test.txt
git add test.txt
git commit -m "dev change test.txt"
git checkout dev2
echo "dev2 change test.txt" >> test.txt
git add test.txt
git commit -m "dev2 change test.txt"
git checkout main
git merge dev
$ git merge dev2
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
这个时候我们打开 test.txt 文本就会出现。
<<<<<<< HEAD
=======
- 上面的代码代表是原本的内容(dev 合并到 main 的内容)
- 下面就是我们
dev2 我内容 >>>>>>> dev2
main
<<<<<<< HEAD
dev change test.txt
=======
dev2 change test.txt
>>>>>>> dev2
我们因该怎么处理呢?
- 现在我们知道了,上面是原本的内容,下面就发生冲突的内容。
- 我们就需要手动合并他们两个的代码,例如我想要保留
dev2 的内容,原本 dev 内容注释掉就可以了。 - 记得要把
<<<<<<< HEAD、=======、>>>>>>> dev2。都删除干净。
main
# dev change test.txt
dev2 change test.txt
然后在进行 commit
git add test.txt
git commit -m "merge dev2"
Stashing
当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。
“暂存” 可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
stash:暂存代码
git stash
git stash list
git stash apply
git stash pop
git stash drop
git stash clear
tag
- 添加标签
git tag v1.0 - 列出标签
git tag - 推送标签
git push --tags - 删除标签
git tag -d v1.0.1 - 删除远程标签
git push origin :v1.0.1
打包发布
--prefix 指定目录名
git archive main --prefix='zyugat/' --format=zip > zyugat.zip
|