- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个分支 develop
和 master
。 develop 中有很多提交还没有在 master
中。尽管我需要使 develop
分支看起来与 master
完全相同。为了保留 develop
中发生的所有更改,我将从 develop
创建新分支,这样所有这些更改都不会丢失。
但是在“复制”develop
之后,我怎样才能安全地重置或恢复到看起来像 master
?
我看到了这个:Git: reset/revert a whole branch to another branches state?
所以要重置,我可以这样做:
git checkout develop
git reset --hard master
但问题是 develop
分支已经被推送到远程,而其他分支已经 pull 了 develop
。
也许有更安全的方法使用恢复或其他方式来做到这一点?但我想恢复(如果可能)以恢复到 master
状态的方式,而不是手动选择每个提交,因为一些最新的提交需要保留在 develop
中,因为它们来自 master(修补程序)。
因此 develop
上的提交历史看起来像这样(最顶层意味着按日期最新提交):
commit hotfix2 - in both develop and master
some other commits that are only in develop
commit hotfix1 - in both develop and master
some commits that are only in develop
all commits that came when develop was created from master
最佳答案
以非破坏性方式撤消提交的标准过程是使用 git revert
.该命令基本上采用目标提交的反向差异并尝试应用它。所以你得到了一个新的提交,它撤销了所有的更改。
为了一次撤消多个提交,您还可以指定一个提交范围。鉴于您只有两个范围想要撤消(那些介于这些修补程序之间的范围),这实际上是可管理的。
您还可以使用标志 --no-commit
, 或 -n
, 不自动创建提交。这允许您链接多个 git revert -n <commit>
一个接一个地执行命令,而无需为每个命令创建还原提交。然后,当您选择完要撤消的所有提交或提交范围后,您可以进行一次 merge 所有提交的提交。
在你的例子中,因为你有另一个分支,它有你想要把你的 develop
的确切(工作目录)状态分支到,这样做要容易得多。您所要做的就是检查 master
的工作树进入你的develop
分支并将该状态提交到 develop
分支。您可以使用 git checkout master -- .
执行此操作.不幸的是,这不适用于 master
未知的路径。分支。因此,如果您在 develop
中添加了新文件分支,那些被保留,你必须单独删除它们。
相反,我们从 master
开始一个新分支(然后具有完全相同的内容),并重置该分支,使其基于 develop
反而。这样,我们将工作目录状态从 master
保留下来。但提交将遵循 develop
反而。之后,我们可以快进develop
那一个 promise :
# checkout a new branch off master
git checkout -b new-develop master
# make a soft reset to develop
git reset --soft develop
# commit the changes
git commit
# get back to develop and fast forward
git checkout develop
git merge --ff-only new-develop
git branch -d new-develop
这将产生与链接 git revert -n
相同的结果所有提交都是 develop
独有的.有几种其他方法可以达到该状态,但这是最简单的方法。
无论您使用哪种方式达到此状态,您都应该考虑之后进行 merge 。 merge 实际上不会做任何事情(因为两个分支具有相同的内容)但它会 merge 历史记录中的分支,因此您会看到它们实际上会收敛。
所以假设历史最初看起来是这样的:
master
↓
* ------------ h1 ------ h2
\ \ \
* -- * -- * -- * -- * -- *
↑
develop
你会想把它变成这样:
master
↓
* ------------ h1 ------ h2 ----- M
\ \ \ / ↖
* -- * -- * -- * -- * -- * -- F develop
F
作为我们在上面创建的修复提交。这假设您想要 merge develop
进入master
( git merge develop
而在 master
)然后快进 develop
( git merge master
而在 develop
)从那时起重新开始开发工作。当然,如果您愿意,也可以从另一个方向进行。
或者,我们也可以 merge M
和修复 F
只需一步。你会有效地 merge develop
进入master
并以您最终得到 master
内容的方式 merge 所有内容.这看起来像这样:
master
↓
* ------------ h1 ------ h2 ---- FM
\ \ \ / ↖
* -- * -- * -- * -- * -- * ---/ develop
你可以像这样手动到达那里:
# since we merge into master, we start there
git checkout master
# start the merge, but don’t attempt to fast-forward and do not
# commit the merge automatically (since we want to change it)
git merge --no-ff --no-commit develop
# reset the index that was prepared during the merge
git reset
# now checkout the files from master and commit the merge
git checkout master -- .
git add .
git commit
实际上,这是一个很常见的场景 git merge
带有一个 merge 策略,正是这样做的。所以我们可以使用 ours
而不是上面的 merge 策略并丢弃我们 merge 到当前分支的任何内容:
git checkout master
git merge -s ours develop
关于git - 恢复分支看起来像主人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38116016/
我使用 Git 有一段时间了,但尽管在博客和教程上花了很多时间,但我仍然无法理解某些功能...:) 我正在与其他人合作一个项目,我的老板为此在 bitBucket 上创建了一个存储库。 我在本地克隆了
有时我会遇到以下问题: 在功能分支中添加一些提交。 从上游更新 master。 想要查看功能分支和 master 之间的差异,但是 git diff master 显示了在 master 中添加/删除
我使用的是 Gerrit 2.4.2 版。我有一个分支 master,我创建了一个名为 newbranch 的新分支。然后我将一些更改推送到远程(Gerrit 的)newbranch。在 Gerrit
假设我们有一个远程存储库并在本地克隆它。 我们 checkout master 分支,所以现在我们有本地 master 和一个 Remote remotes/origin/master . 然后我必须
我有一个项目,其中开发分支使用 CocoaPods,但其中一位开发人员决定删除它并改用 Carthage。 feature 分支使用的是 CocoaPods,因为它是在 develop 分支转换之前一
我有一个有问题的 master 分支需要调试。为此,我想插入一堆调试程序(例如,打印变量),查明错误并应用修复程序。稍后,我想将修复 merge 到 master 分支中,但我不想跳过调试更改。 #
我有一个 master 分支,我正在其中 push 我的最新开发。 现在在某个时候,我确实从 master 分支发布并创建了名为 release1 的新分支。 现在我在master分支上做新的开发 与
我正在尝试使我的一些标准工作流程自动化,我发现自己经常做的一件事是将对远程 master 分支的更改 merge 到我自己的本地分支并推送结果。 所以步骤如下: 转为大师 从远程 pull 更改 切换
使用 Gerrit 很容易意外地将开发分支中的不稳定代码 merge 到稳定分支中: $ git checkout develop $ commit $ git push origin HEAD:re
我有一个正在进行的项目,我正在雇用承包商来帮助我处理代码的某些部分。问题是我不想让任何一个承包商看到所有这些。 我可以在 GitHub 上为他们分配私有(private)存储库下的分支吗?这需要命令行
SVN 分支 Branch 选项会给开发者创建出另外一条线路。当有人希望开发进程分开成两条不同的线路时,这个选项会非常有用。我们先假设你已经发布了一个产品的 1.0 版本,你可能想创建一个新的分支,
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 2年前关闭。 Improve this
有没有办法从特定的修订版中创建(svn)分支, 因为我想跳过提交历史中的一些修订(在新分支中)。 例如,我有从 1 到 1590 的修订,我想创建一个新分支并跳过提交(从 1504 到 1574 )和
到目前为止我看到的所有 svn 分支的例子都是这样的 svn cp -m 'Making test branch' svn://svnrepo/hellosite svn://svnrepo/hell
当我尝试使用 Sonar 扫描仪分析我的项目时,扫描失败并显示以下错误消息: Caused by: Branch does not exist on server: develop 显然,这只发生在它
在我的 Mercurial 存储库中,不知何故,有人输入了空白分支名称: 如果我hg id -r 2004,我确实得到空白文本。现在的问题是,这会导致我们的Redmine安装出现问题,因为它无法同步存
我有以下代码片段: srcaddr >= inet_ntoa . fromJust dstaddr >= inet_ntoa . fromJust -- I want to perform actio
在我的项目中,我有用于工作的本地分支和网络驱动器上的分支我在本地一号和网络一号之间做了“绑定(bind)分支”我的想法是使用绑定(bind)选项自动备份每个本地提交。 我在本地分支提交文件后,我在网络
我想创建一个脚本,根据变量的状态使用不同的表和命令执行不同的操作。在 T-SQL 中,我会这样做: DECLARE @whatToDo INT = 1; IF @whatToDo = 1 BEGIN
Write a program that reads input up to # and reports the number of times that the sequence ei occurs
我是一名优秀的程序员,十分优秀!