Skip to content
索引

拉取代码

git分为本地仓库和远程仓库,一般情况都是写完代码,commit到本地仓库(生成本地仓的commit ID,代表当前提交代码的版本号),然后push到远程仓库(记录这个版本号)

我们本地的git文件夹里面对应也存储了git本地仓库maste

git pull --rebase

在多人使用同一个远程分支合作开发的时候,很可能出现push代码的时候出现以下问题:

sh
To https://github.com/zqy233/git.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/zqy233/git.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
To https://github.com/zqy233/git.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/zqy233/git.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

很明显此时远程分支有新的 commit 未同步到本地,无法推送。正常情况下执行git pull,再push代码即可

但这时git log会多出了一条 merge commit,这个 commit 就是在执行 git pull 的时候自动生成的。如果多人多次如此操作,那么提交记录就会出现很多条这种自动生成的 merge commit,非常难看 要解决以上问题,不再出现自动生成的 merge commit,那么只要在执行 git pull 的时候带上 --rebase 即可

注意事项

  • 执行 git pull --rebase的时候必须保持本地目录干净。 即:不能存在状态为 modified 的文件。(存在Untracked files是没关系的)
  • 如果出现冲突,可以选择手动解决冲突后继续rebase,也可以放弃本次rebase

执行 git pull --rebase 的时候必须保持本地目录干净

1. 有 modified 状态的文件

本地有受版本控制的文件改动的时候,执行git pull --rebase

sh
error: cannot pull with rebase: You have unstaged changes.
error: please commit or stash them.
error: cannot pull with rebase: You have unstaged changes.
error: please commit or stash them.

会出现以上报错,无法操作

就是因为本地有文件改动尚未提交造成的。此时有两种做法

  • 如果本次修改已经完成,则可以先提交(commit)一下
  • 如果本次修改尚未完成,则可以先贮藏:git stash

做了以上一种操作之后再尝试 git pull --rebase,不会再报错。 如果做了 git stash 操作,此时可以通过 git stash pop 回到之前的工作状态

git pull --rebase如果出现冲突,可以选择手动解决冲突后继续 rebase,也可以放弃本次 rebase

sh
# 解决冲突后使用
git rebase --continue
# 或者放弃本次rebase
git rebase --abort
# 解决冲突后使用
git rebase --continue
# 或者放弃本次rebase
git rebase --abort

总结

多人基于同一个远程分支开发的时候,如果想要顺利 push 又不自动生成 merge commit,建议在每次提交都按照如下顺序操作

sh
git stash
git pull --rebase
git push
git stash pop
git stash
git pull --rebase
git push
git stash pop

git reset回退

git reset 命令用于回退版本,可以指定退回某一次提交的版本

命令语法格式如下:

sh
git reset [--soft | --mixed | --hard] [HEAD]
git reset [--soft | --mixed | --hard] [HEAD]

--mixed

默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。

sh
git reset  [HEAD] 
git reset  [HEAD] 

实例:

sh
git reset HEAD^            # 回退所有内容到上一个版本  
git reset HEAD^ hello.php  # 回退 hello.php 文件的版本到上一个版本  
git reset 052e             # 回退到指定版本
git reset HEAD^            # 回退所有内容到上一个版本  
git reset HEAD^ hello.php  # 回退 hello.php 文件的版本到上一个版本  
git reset 052e             # 回退到指定版本

--soft

用于回退到某个版本:

sh
git reset --soft HEAD~index
git reset --soft HEAD~index

实例:

sh
git reset --soft HEAD~3   # 回退上上上一个版本 
git reset --soft HEAD~3   # 回退上上上一个版本 

--hard

撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:

sh
git reset --hard HEAD
git reset --hard HEAD

**注意:**谨慎使用 –-hard 参数,它会删除回退点之前的所有信息

实例:

sh
git reset --hard HEAD~3  # 回退上上上一个版本  
git reset –hard bae128  # 回退到某个版本回退点之前的所有信息。 
git reset --hard origin/master    # 将本地的状态回退到和远程的一样 
git reset --hard HEAD~3  # 回退上上上一个版本  
git reset –hard bae128  # 回退到某个版本回退点之前的所有信息。 
git reset --hard origin/master    # 将本地的状态回退到和远程的一样 

HEAD 说明:

  • HEAD 表示当前版本
  • HEAD^ 上一个版本
  • HEAD^^ 上上一个版本
  • HEAD^^^ 上上上一个版本
  • 以此类推...

可以使用 ~数字表示

  • HEAD~0 表示当前版本
  • HEAD~1 上一个版本
  • HEAD^2 上上一个版本
  • HEAD^3 上上上一个版本
  • 以此类推...

Released under the MIT License.