作者:zyugat.cn/zyugat.com
Git 从了解到精通(2)分支管理及代码冲突和Stashing
git pull
:拉去更新,自动合并。
git fetch [remote-name]
:拉取更新,和不会自动合并到当前工作分支。
git branch --no-merged
:查看未合并的分支
git branch --merged
:查看已经合并的分支
# 1. 创建分支
git branch dev
# 2. 切换分支
git checkout dev
# 3. 新建并切换分支
git branch -b dev
# 4. 分支改名, 将 master 分支改为 main
git branch -m master main
# 5. 合并分支,需先切换到 main 主分支上在执行
# 记得 Push!
git checkout main
git merge dev
# 6. 删除分支
# 如果分支 dev 还未合并到 main 会提示无法删除,需使用 -D 强制删除
git branch -d dev
# 7. 查看本地分支
git branch
# 8. 查看远程分支
git branch -r
# 9. 如果远程分支有个 develop ,而本地没有,你想把远程的 develop 分支迁到本地:
git checkout -b develop origin/develop
例如有两个分支,main 和 dev。
对分支做出改变
**了,会导致 main 和 dev 分支不是一个起点,从而多出了一步合并操作,当发生冲突的时候,就需要管理 main 的人去处理冲突。# 正常合并
* 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 分支是最新的
git checkout dev
git rebase main
git commit -m "dev news"
# main 分支合并
git checkout main
git merge dev
使用 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第一步到第四步是部署环境,从第五步开始就是模拟冲突。
# 1. 新建两个分支
git branch dev
git branch dev2
# 2. 在 dev 分支上创建, 然后合并到
git checkout main
echo "main" >> test.txt
git add test.txt
git commit -m "commit test.txt"
# 3. 将 main 分支合并到 dev and dev2 分支
git checkout dev
git merge main
git checkout dev2
git merge main
# 4. 在 dev 和 dev2 分支上分别修改 test.txt
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"
# 5. 开始模拟冲突
# 1) 合并 dev and main 分支
git checkout main
git merge dev
# 2) 合并 dev2
$ 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
=======
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"
当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。
“暂存” 可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
stash:暂存代码
# 暂存代码
git stash
# 查看暂存代码
git stash list
# 恢复
git stash apply
# 恢复的同时删除记录
git stash pop
# 恢复完后最好删除那次记录
git stash drop
# 清空所有
git stash clear
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