- 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”,然后想到别的东西,然后输入例如“git checkout master”。当然,这给我留下了 $ git git checkout master git: 'git' is
我做到了 git 克隆 git://foo.git 光盘富 ...编辑文件.. 现在我想重新开始。我不在乎我已经做出的任何改变,但我不想再次克隆整个巨型 foo.git,只是丢失我所有的更改。我怎
我在我的电脑上开发代码,我的计算节点很少。 为了让我的程序保持同步,我决定使用 git。以前,我以一种单向模式使用它来“下推”从 PC 到计算节点的更改。但是时不时遇到计算节点特有的小bug,现场修复
虽然它似乎什么也没做,但它没有给出任何警告或错误消息。有什么想法吗? 最佳答案 来自 Git 源的注释: /* * Read a directory tree. We currently ignor
我知道如何为这样的 HTTPS 请求提供用户名和密码: git clone https://username:password@remote 但我想知道如何像这样向 Remote 提供用户名和密码:
Git GUI、Git Bash 和 Git CMD 之间有什么区别?我是初学者,为了进行安装,我发现自己通常同时使用 git bash 和 git CMD 最佳答案 Git CMD 就像使用 git
有人能告诉我git中文件索引被删除是什么意思吗?这些文件在我的 VS Code 中标记为红色,但我仍然可以修改文件并将更改推送到将反射(reflect)这些更改的远程存储库。我认为这一切都是在我使用命
我通过 git 子树将 GLFV 库添加到项目中,但出现此警告“看起来您的 git 安装或您的 git-subtree 安装已损坏”。还描述了几个原因,为什么这可能是: 如 git --exec-pa
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我一直在阅读一篇文章,作者在其中指示:在现有存储库中创建一个新存储库,并想知道这是否是他忽略的错误。稍后我会与他核实。 这些是我要检查的条件: 将现有目录制作成仓库的条件,并且已经 checkin 主
我确实在不同的计算机上处理相同的项目,我想知道是否有一种方法可以跟踪该 .git 文件夹,这样我就不必在所有本地文件中重新配置配置文件。 我将所有工作推送到 bitbucket。 最佳答案 不,没
这个问题在这里已经有了答案: How does git store files? (3 个答案) 关闭 9 年前。 我为我的许多项目创建了一个远程存储库,所以它是我的push 的目的地。与 git
应该如何在 git 中查看文件内容的完整历史记录? 一个文件在 git 中的历史很短,存储库通过 git-svn 同步,但在 svn 中的历史很长。 git 中的历史记录到达文件移动的位置。要查看历史
我是confused here ... 如何对修改后的文件进行git commit,以及如何对新文件进行git commit? 还有,你如何在git中单独提交文件? 最佳答案 git 提交过程分为两个
正在搜索 throw SO 来寻找答案。遇到这个似乎没有给出任何答案的旧线程。重新触发此线程,希望有人知道! 有人能告诉我 git subtree 和 git filter-branch 的区别吗?为
我想知道是否有一种方法可以避免在每个 Git 命令的开头键入单词 git。 如果有一种方法可以在打开命令提示符进入 “Git 模式” 后只使用一次 git 命令就好了。 例如: git> 之后,我们键
当您修改工作目录中的文件时,git 会告诉您使用“git add”暂存。 当您向工作目录添加新文件时,git 会告诉您使用“git add”开始跟踪。 我对这两个概念有点困惑,因为我假设跟踪文件的更改
为什么 git://有效 $ git clone git://github.com/schacon/grit.git Cloning into 'grit'... ... Checking conne
我在以下沙箱中练习 git:https://learngitbranching.js.org/?NODEMO 我在两个单独的 session 中运行了两组命令。第一组命令顺序如下: git clone
我是一名优秀的程序员,十分优秀!