【Git】优雅的提交代码

你在提交代码时,可能会遇到这样的问题:提交完代码后,发现代码里混进了别人的内容,特别是用了 git pull 合并后。这会让你的提交看起来很乱,别人也分不清哪些是你的修改。这个时候,你可以使用 git pull --rebase 代替普通的 git pull

理想步骤如下:

  1. add操作:先将修改保存起来。
  2. 同步代码:用 git pull --rebase 代替 git pull
  3. commit操作:提交修改。
  4. push操作:推送代码。

操作步骤如下:

1. add操作

先确保你修改的代码已经保存,接着把代码添加到暂存区:

git add .

2. 使用 git pull --rebase 同步代码

不要直接用 git pull,而是用 git pull --rebase,它会先把远程仓库的更新拉下来,放在你的修改前面,这样你的提交会保持在最上面:

git pull --rebase origin branch-name

这里的 branch-name 就是你所在的分支名。

这个命令做了以下几件事:

  • 暂时移开你本地的提交;
  • 拉取并应用远程的更改;
  • 再把你的提交放回去,让修改顺序更清晰。

3. 解决冲突

如果拉取时有冲突,Git 会提醒你。解决冲突后,继续 rebase 操作:

git rebase --continue

4. 提交修改

同步完远程代码并解决冲突后,你就可以提交修改了:

git commit -m "Your commit message"

5. 推送到远程仓库

最后,把代码推送到远程仓库:

git push origin branch-name

其他情况

问题1

发生冲突怎么办?

如果在执行 git pull --rebase 时遇到冲突,Git 会暂停 rebase,并提示冲突的文件。解决冲突的步骤如下:

1. 查看冲突文件

可以用 git status 查看哪些文件有冲突,Git 会用 both modified 标出有冲突的文件。

2. 解决冲突

打开冲突的文件,Git 会标出冲突部分:

<<<<<<< HEAD
// 你的代码
=======
 // 远程代码
>>>>>>> branch-name

根据需要保留本地、远程或合并两者的代码。

3. 添加解决后的文件

解决冲突后,重新添加文件:

git add conflicted-file

或者用 git add . 一次性添加所有文件。

4. 继续 rebase

解决完冲突后,继续 rebase:

git rebase --continue
5. 取消 rebase(如果遇到问题)

如果在解决冲突时遇到困难,或你不希望继续 rebase,可以取消当前的 rebase 操作,恢复到最初的状态:

git rebase --abort

6. 完成 rebase 后推送修改

当 rebase 完成后(没有冲突了),你可以将你的代码推送到远程仓库。如果你的分支已经被其他人更新过,你需要使用 --force-with-lease 选项强制推送:

git push --force-with-lease origin branch-name

这里的 --force-with-lease 是一个安全的强制推送选项,确保你不会无意间覆盖掉别人的修改。

问题2

git push --force-with-lease 被拒绝后怎么办?

如果强制推送被拒,可能是因为远程有新的提交。你可以这样解决:

1. 获取最新更新

先获取远程仓库的最新状态:

git fetch origin
2. 合并或重新 rebase

你可以选择合并或者 rebase。

合并方式

git merge origin/branch-name

解决冲突后:

git add .
git commit -m "Merge remote changes"
git push origin branch-name

rebase方式

git rebase origin/branch-name

解决冲突后:

git add conflicted-file
git rebase --continue
git push --force-with-lease origin branch-name
3. 如果还是无法推送

重复上述步骤,直到成功推送。

4. 最后手段

如果一定要覆盖远程内容,可以强制推送:

git push --force origin branch-name

注意:强制推送会覆盖远程内容,请谨慎使用