git本地修改以后,从远程更新分支以后,解决冲突,上传,整体步骤
首先我们要明确,本地修改的代码,要进行暂存,不然git不知道做了修改,暂存的方法,有两种,第一种是git stash,第二种是git add ,这两种的区别在于
功能点 | git stash | git add |
---|---|---|
作用 | 临时保存修改,清理工作目录 | 准备将修改提交到历史记录 |
修改存储位置 | 保存到 stash 堆栈 | 保存到暂存区(Staging Area) |
是否影响历史记录 | 不会直接影响提交历史 | 下一次提交时会影响历史记录 |
常用场景 | 临时保存修改,方便切换分支或操作 | 准备提交修改 |
是否可恢复 | 可以通过 git stash pop/apply 恢复 |
提交完成后,修改已记录,不能回滚到暂存 |
是否与提交相关 | 独立于提交历史,不用于提交 | 用于准备提交 |
在解决本地修改与远程同步的问题时,选择使用 git stash
或 git add
取决于你的具体需求。以下是两者的对比与适用场景:
1. 使用 git stash
适用场景
- 暂存未完成的修改:代码尚未完成,不希望提交到本地历史中。
- 临时保存修改:需要切换分支或执行其他操作,但又不希望丢失当前工作。
- 保持提交历史干净:不想为了中间状态创建无意义的提交。
使用方式
-
暂存本地修改:
git stash
这会将工作目录恢复为干净状态,所有未提交的修改被存储在栈中。
-
拉取远程更新:
git pull --rebase
-
恢复修改:
git stash pop
恢复后如果产生冲突,解决冲突后继续:
git add <文件> git rebase --continue
优点
- 安全:本地的修改不会影响到提交历史,可以随时恢复。
- 灵活:适合未完成的代码开发,保存后可以切换其他分支或任务。
缺点
- 增加步骤:需要手动存储和恢复修改。
- 复杂性:如果使用不当(如忘记
stash pop
),可能丢失工作内容。
2. 使用 git add
适用场景
- 准备提交当前修改:代码修改已完成并准备提交。
- 解决冲突时的必备操作:标记冲突已解决。
- 保留工作进度:希望随时将当前更改提交到历史中。
使用方式
- 将修改添加到暂存区:
git add .
- 创建一个临时提交:
git commit -m "临时保存修改"
- 拉取远程更新:
git pull --rebase
- 解决冲突后合并提交历史(如果需要):
git rebase --continue git reset --soft HEAD~1 # 撤销临时提交,但保留修改,
HEAD~1
表示上一个提交,HEAD~3最近的 3 次提交 git commit -m "合并后的提交信息"
优点
- 直观:使用
add
和commit
后,所有修改都保存在版本历史中,不会意外丢失。 - 无需额外步骤:省去
stash
的存储和恢复过程。
缺点
- 污染历史:如果提交不够有意义,可能导致提交记录变得冗杂。
总结
需求/情况 | 推荐方法 | 理由 |
---|---|---|
代码尚未完成,不想提交到历史 | git stash |
暂时存储修改,保持提交历史干净。 |
代码已完成,准备提交 | git add + commit |
将更改纳入版本控制,形成明确的提交历史。 |
解决冲突 | git add |
标记冲突已解决后继续操作(rebase 或 merge )。 |
不确定是否提交到历史 | git stash |
保留修改的灵活性,不做提交决策。 |
多个功能修改混杂,需拆分提交 | git add -p |
按片段逐步添加修改,进行精确控制。 |
临时保存但不想写提交信息 | git stash |
避免为临时状态创建无意义的提交。 |
最佳实践
-
开发过程中:
- 未完成的代码:用
git stash
。 - 已完成的功能:用
git add
提交。
- 未完成的代码:用
-
保持提交历史干净:
- 如果是临时的工作进展,用
stash
。 - 如果是功能点完成,用
add
和有意义的提交信息。
- 如果是临时的工作进展,用
-
团队协作中:
- 使用
stash
可以减少提交历史中的临时记录。 - 使用
add
可确保在协作过程中有明确的提交进展。
- 使用
选择方法时,根据项目管理风格和个人习惯灵活调整。
如何避免冲突?
如果你希望在拉取远程更新时完全覆盖本地修改,或者你想自动解决冲突(例如自动采用远程版本),可以考虑以下方法:
1. 使用 git pull --rebase --strategy=theirs
--strategy=theirs
会强制 Git 在发生冲突时选择远程版本而不是本地版本。这会自动解决冲突,并且丢弃本地修改,只保留远程仓库的更改。
git pull --rebase --strategy=theirs
2. 保持本地修改但自动解决冲突
如果你希望保留本地修改(即保留本地更改而不是丢弃),可以使用以下命令来避免冲突并继续 rebase:
git pull --rebase --strategy=ours
--strategy=ours
会使用本地的修改覆盖远程的冲突内容,但会继续拉取远程更新。
3. 手动解决冲突
如果你希望手动处理冲突,则可以继续按照通常的冲突解决方式处理:
- 执行
git pull --rebase
(如果遇到冲突,Git 会暂停并标记冲突文件)。 - 解决冲突后,执行
git add <冲突文件>
。 - 继续 rebase 操作:
git rebase --continue
4. 强制覆盖本地修改(谨慎使用)
如果你完全想丢弃本地的所有修改,直接重置工作区:
git reset --hard
git pull --rebase
这会丢弃所有本地修改并将工作区恢复到远程仓库的状态。
总结
git stash
保存了你的本地更改,但git pull --rebase
会基于提交历史进行操作,冲突通常发生在已提交的内容之间。- 如果你希望避免冲突并自动采用远程的版本,可以使用
git pull --rebase --strategy=theirs
。 - 如果你想保持本地修改并解决冲突,可以手动解决冲突并继续
git rebase
。 - 使用
git stash
并不自动解决冲突,冲突的发生与提交历史有关,而非工作区的内容。
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18611300,如有侵权联系删除