需要经常处理git,记录一些有点儿麻烦但是有用的。
单独文件回滚
dev分支上修改了A、B文件,将dev分支的文件A回滚到main分支的文件A
- 切换到
main分支 确保main分支是最新的,以便回滚时不会丢失任何重要的更改。
git checkout main
git pull origin main # 或者 git fetch && git merge origin/main
- 切换到
dev分支 切换回dev分支,以便你可以访问文件A。
git checkout dev
- 找到文件
A的差异 使用git diff命令找到main分支和dev分支之间的差异。
git diff main..dev -- A
这将显示 dev 分支和 main 分支中文件 A 的差异。
- 应用差异到
main分支 将这些差异应用到main分支。你可以使用git cherry-pick命令来选择特定的提交,或者使用git checkout命令来复制文件。
** 使用 git cherry-pick **
如果你只想回滚特定的提交:
git cherry-pick <commit-hash>
** 使用 git checkout **
如果你想复制文件 A 从 dev 分支到 main 分支:
git checkout dev -- A
- 添加和提交更改 将更改添加到暂存区并提交。
git add A
git commit -m "Revert changes from dev branch"
- 推送更改到远程
main分支 将更改推送到远程main分支。
git push origin main
- 验证更改
切换回
main分支并验证更改。
git checkout main
现在,文件 A 应该已经从 dev 分支回滚到 main 分支。
部分文件分支挪动/分支文件拆分
我在dev分支上修改了A、B、C三个文件并push了,现在希望把A、B文件修改挪到分支main上,挪完后,dev分支上只有C文件修改。
-
确保你在
dev分支上(因为你要从这里提取修改):git checkout dev -
切换到
main分支:git checkout main -
从
dev分支中检出(checkout)A 和 B 文件到main分支:git checkout dev -- A B这条命令的意思是:从
dev分支中取出A和B文件的最新版本,并覆盖当前分支(main)中的对应文件。 -
在
main分支上提交这些更改:git add A B git commit -m "将 A 和 B 文件的修改从 dev 分支移动到 main 分支" -
切换回
dev分支:git checkout dev -
在
dev分支上移除 A 和 B 文件的修改(即只保留 C 文件的修改):你可以使用
git restore(Git 2.23 及以上版本)或者git checkout来撤销对 A 和 B 文件的修改。-
使用
git restore(推荐):git restore A B这会将
A和B文件恢复到最近一次提交的状态,即移除你在dev分支上对它们的修改。 -
或者使用
git checkout(旧版本 Git):git checkout -- A B
-
-
验证
dev分支上只有 C 文件有修改:git status应该只显示
C文件被修改,而A和B文件已恢复到之前的状态。
本地分支同步远程分支
当代码提交,并通过pull request merge之后,远程的分支就被删除了;希望本地也和远程一样简洁
自动检测并删除远程已删除的本地分支
- 得到远程分支最新情况
git fetch --prune
- 删除远程已删除但本地仍存在的分支
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D
3.上面两个请求二合一
git fetch --prune && git branch -vv | awk '/: gone\]/ {print $1}' | xargs -r git branch -D
Prettier 改动的文件
与main分支比较,只Prettier格式化当前分支中变动文件
git diff -z --name-only --diff-filter=ACMR main...HEAD -- src/ | xargs -0 -I {} prettier --write {}
比较工作区与最近一次提交,无论文件是否被add,只要发生变动,就format
git diff --name-only --diff-filter=ACMR HEAD -- src/ | xargs prettier --write