github: reset 与 rebase, pull 与 fetch 的区别

reset 与 rebase

完全不同的两个命令.reset的意思是回退你的代码到某一个具体的版本,rebase是指回退你个commit到某一次commit. git-reset 会修改 .git/refs 目录和 .git/index 文件. 但它不会修改任何和你的 commit 相关的东西. git-rebase 则会试图去修改你已经 commit 的东西, 比如想要覆盖你的 commit 历史之类的. 但是千万不要用 rebase 来修改已经 push 过的内容, 否则可能导致 rebase 修改过的内容和原先的内容完全不兼容, 然后影响到别人的代码.

也就是说你可以用这个工具: interactive rebasing. 在终端输入 git rebase -i 262d1f7看到输出如下:

pick 262d1f7 Added HTML header (v1)
pick a006669 Oops, we didn't want this commit
pick a6faf60 Revert "Oops, we didn't want this commit"
pick b7b5fce This reverts commit a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8.
pick cdb39b0 Commit p tags with text (v1.1)
pick 9b2f3ce Added an author comment
pick 55649c3 Add an author/email comment
pick 0b1dd4c Moved hello.html to lib
pick 5854339 Added index.html
pick 801e13e Added README
pick a6792e4 Added css stylesheet
pick 17a64df Hello uses style.css (HEAD, origin/style, master),

这样你不想要的 commit 就被删掉了. 但是如果你已经 push 过这些 commit, 那就不要再跑 rebase 了. 其实有这些行在 commit 记录里面也无所谓.

rebase 还有一个功能是解决内容冲突的. 就是说你当前的 working directory 里面的内容它不是最新的, 有人修改了一个文件, 放到 remote 上面去, 好死不死的你也改了这个文件的同一个地方. 这时候你发现有个 pull 更新, 你要从 remote 上面把这个更新 pull 下来. 那 pull 是有自动 merge 的功能的, 问题在于现在 merge 是肯定要失败的, 因为别人和你修改了同一个文件的同一块代码. 这时候, 你需要把自己的 working directory rebase 到服务器上的最新版本, 然后修改冲突, 再把你自己的修改 push 上去. 

从日常的用法来说呢, 如果你碰到了某个 PROD issue, 这个 issue 很可能只有 PROD 那个版本有, 那么你想退回到那个版本,你就用reset命令来做。他会回退你的本地代码到某一个指定的版本,但是你的commit历史完全不会被影响的。

那另外一种情况就是,你从master签出了一个branch, 然后自己很开心的在那修改。这时候别的人会把他的修改merge到master里面啊,那意味着你现在这个branch的版本后落后于master,这时候你肯定不想重新从master签出一个branch进行开发吧,你更愿意把自己的branch刷新到master的最新版本上去,这时候就可以用rebase命令来做了。

pull 与 fetch

简单说来, git pull = git fetch + git merge. 事实上, git pull 是 git fetch; git merge FETCH_HEAD 两个命令合并后的简写方式, 类似语法糖的东西.

你可以在任意时刻用 git fetch 更新对于服务器上的分支的版本的跟踪信息: .git/refs/remotes/<remote>/. 它不会修改你本地的任何分支的内容refs/heads, 所以也不会改动你 working directory 里面的东西. 

git pull 会更新你本地代码到服务器上对应分支的最新版本, 当然也会更新跟踪信息: .git/refs/remotes/<remote>/.

Git 文档: git pull


git reset 和 git rebase 是两个不同的命令,它们有着不同的功能和应用场景。 git reset 的作用是将代码回退到某一个具体的版本,它会修改 .git/refs 目录和 .git/index 文件,但不会修改任何与 commit 相关的东西。通过 git reset,你可以将你的代码库重置到指定的提交点,之前的提交记录将会丢失,但代码仍然会保留。这意味着回退后的代码库和之前的提交记录将没有任何关联。一般情况下,git reset 用于本地代码库的调整和修复,不会对远程库产生影响。然而,需要注意的是,不要使用 reset 命令修改已经 push 过的内容,否则可能会导致代码不兼容,并影响到其他人的代码。 git rebase 的作用是变基,它可以用于合并多次提交为一次提交。通过 git rebase,你可以修改已经提交的内容,包括覆盖提交历史等操作。rebase 将尝试修改你已经提交的内容,因此在使用 rebase 命令时要小心,确保不要对已经 push 过的内容进行修改,以免导致代码不兼容并影响其他人的代码。rebase 一般用于协作开发中,将多个提交合并为一个干净的提交,以便更好地管理代码历史。 综上所述,git reset 和 git rebase 在功能和使用场景上有所不同。reset 用于回退代码到某一特定版本,保留代码但丢失之后的提交记录;而 rebase 用于变基,合并多次提交为一次提交,并修改已经提交的内容。 使用这两个命令时,需要谨慎操作,尤其是在处理已经 push 过的代码时。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [github: resetrebase, pullfetch区别](https://blog.csdn.net/changtianshuiyue/article/details/51620588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [git reset revert rebase 区别](https://blog.csdn.net/u012745499/article/details/114163835)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值