SourceTree 拉取、重置提交、回滚、变基与合并

本文详细介绍了SourceTree中如何重置当前分支到特定提交,包括软合并、混合合并和强行合并的差异。同时,讨论了gitfetch和gitpull的使用场景,以及变基与合并的区别。在变基操作中,强调了其在多人协作开发中的应用和对提交历史的影响。此外,还涵盖了Git的HEAD指针以及如何回滚提交。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SourceTree的重置当前分支到此次提交

使用场景:“我想把已提交未推送的修改撤销”

在这里插入图片描述

使用模式说明
软合并软合并是指将此次提交回滚到指定提交位置,但这个过程中会将修改过的文件暂存到暂存区。
混合合并混合合并是指将此次提交回滚到指定的位置,但这个过程中不会将修改过的文件暂存到暂存区,而是将修改过的文件存放在未暂存文件区。
强行合并强行合并是指将此次提交回滚到指定的位置,但这个过程中将直接丢弃之前修改的所有文件,
因此在选取此种合并时需要考虑清楚,避免一些不必要的麻烦。

SourceTree 拉取选项

在这里插入图片描述

第一个是你有改动的文件要提交,不然合并失败
第二个是你提交文件的描述在合并时也会显示,就是合并的内容是你提交的信息
第三个是将远程的修改首先放到暂存区,由自己来创建一个新的提交然后再推送到远程
第四个是接下来要说的变基与合并

git fetch 从远端仓库下载新分支与数据
git pull 从远端仓库提取数据并尝试合并到当前分支

Git 有两个命令用来从某一远端仓库更新。 git fetch 会使你与另一仓库同步,提取你本地所没有的数据,为你在同步时的该远端的每一分支提供书签。 这些分支被叫做“远端分支”,除了 Git 不允许你检出(切换到该分支)之外,跟本地分支没区别 —— 你可以将它们合并到当前分支,与其他分支作比较差异,查看那些分支的历史日志,等等。同步之后你就可以在本地操作这些。

第二个会从远端服务器提取新数据的命令是 git pull。 基本上,该命令就是在 git fetch 之后紧接着 git merge 远端分支到你所在的任意分支。 不太喜欢这命令 —— 也可以 fetch 和 merge 分开来做。少点魔法,少点问题。 不过,如果你喜欢,你可以看一下 git pull 的 官方文档。

假设你配置好了一个远端,并且你想要提取更新,你可以首先执行 git fetch [alias] 告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch] 以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。

SourceTree 变基与合并

  • 两者都可以把别人提交的代码,同步到自己的开发分支。
  • “合并”,从SourceTree的图表上看,会有多条线。而“变基”只有一条蓝色的线(如下图)。

在这里插入图片描述

变基操作在SourceTree上的使用

假设“变基”的使用场景
多人同时开发,小明同学在dev1分支上开发,“我”在dev2分支上开发;
小明同学开发完成并提交了代码到他的dev1分支上,“我”也开发完成并提交到dev2上;
现在“我”要把小明的代码,同步到“我”的分支,也就是,dev1同步到dev2。

“变基”的操作步骤

  1. 小明同学提交代码到 develop,“我”把分支切换到 develop,并拉取最新代码
  2. 然后“我”切换到 fix-bug,并选中小明同学提交的 develop 分支代码
  3. 鼠标右击,选中“变基”
  4. 点击“确定”,变基完成

点击变基后可能直接完成变基,也可能会出现如下图情况,需要手动点击拉取按钮,如果没冲突“提交”按钮就会亮起,有冲突解决冲突后再提交,即可完成变基操作。
在这里插入图片描述
在这里插入图片描述
变基的影响

总结下来,Git变基的作用也是整合变更,首先在待合并分支执行变基,最后还是归于分支合并,但是在这个过程与直接合并分支还是有差别,正如本文的例子,可以看出变基会保留分支的提交历史,但是是通过将其并入主线保存的,之后关于该分支开发的具体历史及关系,已经被遮盖了,即历史已被休整,而我们通过直接合并分支方式整合变更时,分支的提交记录依然可以以分支的形式独立存在,历史未被修改。

选择变基还是合并

变基会修整历史,然后将分支历史并入主线,可以理解成美化过的历史,而合并则可以不修改历史,让分支历史依然独立存在,可以看作原始的历史。

所以选择变基还是合并,看具体需求,你只是想要一个清晰,明了的历史,并不关系历史的具体来源,你可以首选变基,但是如果你想比较清楚地了解项目不同阶段的原始历史,你可以选择直接合并。

一个原则:永远不要对已经推到主干分支服务器或者团队其他成员的提交进行变基,我们选择变基还是合并的范围应该在自己当前工作范围内。

SourceTree 回滚提交

使用场景:“我想把某一次的错误修改全部撤销”

已提交未推送,已提交已推送的都可以回滚到

在这里插入图片描述

Git中的HEAD解释

HEAD
HEAD 指向当前所在分支提交至仓库的最新一次的 commit

# 使用最新一次提交重制暂存区
git reset HEAD -- filename

# 使用最新一次提交重制暂存区和工作区
git reset --hard HEAD

# 将 commit log 回滚一次 暂存区和工作区代码不变
git reset --soft HEAD~1

HEAD~{n}
~ 是用来在当前提交路径上回溯的修饰符
HEAD~{n} 表示当前所在的提交路径上的前 n 个提交(n >= 0):

HEAD = HEAD~0
HEAD~ = HEAD~1
HEAD~~ = HEAD~2
HEAD{n个~} = HEAD~n

HEAD^n
^ 是用来切换父级提交路径的修饰符。当我们始终在一个分支比如 dev 开发/提交代码时,每个 commit 都只会有一个父级提交,就是上一次提交,但当并行多个分支开发,feat1, feat2, feat3,完成后 merge feat1 feat2 feat3 回 dev 分支后,此次的 merge commit 就会有多个父级提交。

示例:

# 当前提交
HEAD = HEAD~0 = HEAD^0

# 主线回溯
HEAD~1 = HEAD^ 主线的上一次提交
HEAD~2 = HEAD^^ 主线的上二次提交
HEAD~3 = HEAD^^^ 主线的上三次提交

# 如果某个节点有其他分支并入
HEAD^1 主线提交(第一个父提交)
HEAD^2 切换到了第2个并入的分支并得到最近一次的提交
HEAD^2~3 切换到了第2个并入的分支并得到最近第 4 次的提交
HEAD^3~2 切换到了第3个并入的分支并得到最近第 3 次的提交

# ^{n} 和 ^ 重复 n 次的区别 
HEAD~1 = HEAD^
HEAD~2 = HEAD^^
HEAD~3 = HEAD^^^
# 切换父级
HEAD^1~3 = HEAD~4 
HEAD^2~3 = HEAD^2^^^
HEAD^3~3 = HEAD^3^^^

其他 Git 问题参考

Git飞行规则(Flight Rules) 40+k(star)
在这里插入图片描述
参考资料:
Git 变基-官网
Git 变基-w3cschool

<think>好的,用户想在SourceTree里进行rebase操作,我需要一步步解释清楚。首先,得确认用户的本操作流程,比如如何选择分支,如何发起。根据提供的引用内容,引用[3]详细说明了步骤,应该作为主要参考。 首先,用户需要确保自己的开发分支是于最新的master分支。这时候需要切换到master分支,远端更新。这里要强调先更新本地master,避免冲突。然后切换回开发分支,选择到master。如果有冲突,SourceTree会提示,这时候需要解决冲突,可能用到“Resolve using ‘Theirs’”或者手动处理,引用[2]提到这一点。 接下来,在过程中遇到冲突的话,用户需要打开冲突文件,查看具体冲突位置。引用[1]提到SourceTree会高亮显示冲突文件和行,这对用户定位问题很有帮助。解决完冲突后,继续操作,直到完成。最后推送分支到远端,保持整洁。 还要注意提醒用户合并的区别,会改写提交历史,适合个人分支,避免在公共分支使用。另外,推送时可能需要强制推送,但需谨慎。这些注意事项能帮助用户避免常见错误。 用户可能遇到的问题包括冲突解决步骤不清晰,或者后的推送问题。需要分步骤说明,确保每个环节都覆盖到。同时,相关问题的生成要考虑用户后续可能的需求,比如如何撤销,处理冲突的技巧,以及的最佳实践。这些扩展问题能帮助用户更深入理解rebase的使用场景和方法。</think>### 分步指南:在 SourceTree 中执行操作 #### **一、础操作流程** 1. **更新主分支** - 切换到 `master` 分支(或其他目标分支),点击「」按钮获远端最新代码[^3]。 - 示例:若主分支是 `main`,需先执行 `git pull origin main`。 2. **发起** - 切换回你的开发分支(如 `dev-1`),在分支列表中右键点击目标分支(如 `master`),选择「将当前到 [目标分支]」[^3]。 - 此时 SourceTree 会尝试自动应用你的提交到目标分支的最新提交之后。 3. **冲突处理** - 若出现冲突,SourceTree 会在界面中高亮冲突文件及具体代码行[^1]。 - 双击冲突文件,选择使用「Theirs」(保留目标分支内容)或手动修改后标记为已解决。 - 点击「继续」按钮完成剩余提交的应用[^2]。 4. **推送更** - 完成后,需强制推送更新到远端分支:`git push --force-with-lease origin dev-1`(注意:强制推送会覆盖远端历史)。 #### **二、关键操作示意图** ```plaintext 操作路径示例: 开发分支 dev-1 → 右键 master → → 解决冲突 → 继续 → 强制推送 ``` #### **三、注意事项** 1. **合并的区别** 会改写提交历史,使分支线性整洁,适合未共享的本地分支;合并保留原始历史,适合公共分支[^3]。 2. **强制推送风险** 仅在私有分支使用强制推送,公共分支避免使用,否则可能破坏他人工作副本。 3. **备份策略** 前可通过右键分支 →「创建新标签」备份当前状态,以便回滚
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxhlh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值