Git
- git config --global merge.conflictstyle diff3(合并冲突的时候,能显示原内容)
合并多个 commit
命令行快速模拟 git 操作:
mkdir test
cd test
echo "0" >> a
git add a
git commit -m "Commit-0"
echo "1" >> a
git add a
git commit -m "Commit-1"
echo "2" >> a
git add a
git commit -m "Commit-2"
echo "3" >> a
git add a
git commit -m "Commit-3"
假设最近的 6 个 commit 分别是(由近及远):
feat: commit 5
feat: commit 4
feat: commit 3
feat: commit 2
feat: commit 1
feat: commit 0
# 交互式处理所有在本地未 push 到远端的 commit
git rebase -i
# 处理最近的 4 个 commit(commit2 ~ commit5)
# HEAD~x 表示最近 x 个
git rebase -i HEAD~4
# 指定 commit 区间(前闭后开)(commit2 ~ commit4)
git rebase -i HEAD~4 HEAD~1
然后进入交互区,将需要合并的 commit 从 pick
改成 s
比如先运行 git rebase -i HEAD~4
,然后:(s
会把当前的 commit 合并到之前的 commit)
pick 24e60a8 feat: commit 2
s b6e1a7c feat: commit 3
s 733560b feat: commit 4
s 15be7ed feat: commit 5
如果操作完后,还是在当前分支,则没啥问题,如果出现了另外一个 random hash 的分支(一般就是指定了合并一段 commit)(HEAD 游离态)
比如希望将 commit2 ~ commit4 合并,先运行 git rebase -i HEAD~4 HEAD~1
:
pick 942fbdc feat: commit 2
s 7b9ea5c feat: commit 3
s 5e5d302 feat: commit 4
操作完后发现在分支 d3ac13f
上,然后通过它 checkout 一个临时分支 git checkout -b tmp
然后回到主分支,操作 git rebase --onto tmp <终点提交>
(这个 终点提交 貌似是 tmp 的终点提交),然后还会有冲突需要解决(不知道是不是我操作有问题)
感觉还是直接用 git rebase -i HEAD~4
这样比较方便一点,大不了不处理的 commit 直接原样维持 pick
对于已经 push 到远端的 commit,其他操作类似,做后 git push -f
即可
lock 文件冲突解决
以 pnpm-lock.yaml
为例:
git add pnpm-lock.yaml
git reset pnpm-lock.yaml
git checkout pnpm-lock.yaml # 全部选择远程?
pnpm install # 然后重新 install 更新 lock 文件