拉取代码
git分为本地仓库和远程仓库,一般情况都是写完代码,commit到本地仓库(生成本地仓的commit ID,代表当前提交代码的版本号),然后push到远程仓库(记录这个版本号)
我们本地的git文件夹里面对应也存储了git本地仓库maste
git pull --rebase
在多人使用同一个远程分支合作开发的时候,很可能出现push代码的时候出现以下问题:
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
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
# 解决冲突后使用
git rebase --continue
# 或者放弃本次rebase
git rebase --abort
# 解决冲突后使用
git rebase --continue
# 或者放弃本次rebase
git rebase --abort
总结
多人基于同一个远程分支开发的时候,如果想要顺利 push 又不自动生成 merge commit,建议在每次提交都按照如下顺序操作
git stash
git pull --rebase
git push
git stash pop
git stash
git pull --rebase
git push
git stash pop
git reset回退
git reset 命令用于回退版本,可以指定退回某一次提交的版本
命令语法格式如下:
git reset [--soft | --mixed | --hard] [HEAD]
git reset [--soft | --mixed | --hard] [HEAD]
--mixed
默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
git reset [HEAD]
git reset [HEAD]
实例:
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
用于回退到某个版本:
git reset --soft HEAD~index
git reset --soft HEAD~index
实例:
git reset --soft HEAD~3 # 回退上上上一个版本
git reset --soft HEAD~3 # 回退上上上一个版本
--hard
撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:
git reset --hard HEAD
git reset --hard HEAD
**注意:**谨慎使用 –-hard 参数,它会删除回退点之前的所有信息
实例:
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 上上上一个版本
- 以此类推...