使用git我提交了一些更改,现在希望将它们放在新的分支中。如何解决这个问题在几个地方有所解释,例如here
我的困惑与此任务的本地/远程方面更相关。
我首先将github上的存储库分配给myForkOnGitHubRepo。 然后我将该存储库克隆到我的本地PC:
local: git clone myForkOnGitHubRepo
然后我更改了源代码,提交并推送:
local: git add .
local: git commit
local: git push # (actually I used the minGW Gui for that one since the command line push issued a warning)
现在我的本地更改在myForkOnGitHubRepo中可见。精细。而且现在我注意到我会更喜欢使用新的分支(并且在myForkOnGitHubRepo中对新分支进行更改)。
我是否可以按照我在开头张贴的链接中的说明正确,即
local: git branch newbranch
local: git reset --hard HEAD~1 # only one commit was done
然后 - 好吧,现在怎样?我只需再推一次吗?或者我是否需要明确推送新分支? (对不起,如果这是非常基本的,我以前从未使用过这个)。
在创建newbranch之前还有什么需要做的吗?我的理解是,在推送后,本地和远程处于同一状态,这是正确的吗?
答案 0 :(得分:3)
local:git branch newbranch
local:git reset --hard HEAD~1#只做了一次提交
现在,强制(-f)推送到remote/master
,因为git历史记录已更改。
$ git push -f origin master
结帐至newbranch
并同时推送newbranch
。
$ git checkout newbranch
$ git push origin newbranch
常见情况是master
分支应继续工作或不破坏。因此,当需要处理新功能时,请从feature
创建一个新分支(例如,master
)。
$ git checkout master
$ git checkout -b feature
在feature
分支上工作。完成feature
分支add
,commit
和push
到远程。
$ git add.
$ git commit -m 'message'
$ git push origin feature
现在,如果feature
分支的所有测试都正常,则创建Pull请求或与master合并
$ git checkout master
$ git pull origin feature # pull = fetch + merge
$ git push origin master # update remote/master
我的理解是,在推送后,本地和远程处于同一状态,这是正确的吗?
是的,当你推到遥控器时,你的本地&远程同步(相同的数据)
现在,如果您需要feature
分支的更改/提交(假设feature
尚未与master
合并)在另一个分支中(例如,dev
),那么,只需从dev
创建一个分支(master
),然后将feature
分支拉入dev
$ git checkout master
$ git checkout -b dev
$ git pull origin feature # pull 'feature' into 'dev'
# do changes here
$ git commit -am 'Added new feature' # add & commit
$ git push origin dev
答案 1 :(得分:1)
如果您已经通过提交将分支推送到远程,那么只需从中创建一个新分支并将其推送到远程,如下所示:
$ git checkout -b newbranch
$ git push origin newbranch
但是,如果您直接从分支分支创建了一个分支,或者从没有提交的分支创建了一个分支,那么使用commit id将cherry pick提交到新分支并将其推送到远程。
$ git checkout branch
$ git log // look for commit id you want to move to another branch
$ git checkout newbranch
$ git cherry-pick <commit-d>
$ git push origin newbranch
我的理解是,在推动之后,本地和远程都在 同样的状态,这是正确的吗?
是,只要您不修改这些文件:.gitignore
,.git/info/excludes
和~/.gitexclude
,以避免将内容推送到远程。
答案 2 :(得分:1)
我是否可以按照我在开头张贴的链接中的说明正确,即
local: git branch newbranch local: git reset --hard HEAD~1 # only one commit was done
是
然后 - 好吧,现在怎样?我只需要再推一次吗?
是。此外,您必须推送两个分支名称,其中一个需要&#34;强制推送&#34;。
或者我是否需要明确推送新分支? (对不起,如果那是非常基本的,我之前从未使用过它。)
虽然它是基本的,但这里有一堆历史问题。 Git默认情况下表现不同,大多数用户的行为都是错误的。 Git有覆盖默认值的选项,但默认是错误的。因此,在Git 2.0版中,默认行为发生了变化。为了实现这一目标,Git添加了一大堆配置项,以便您可以设置默认行为,如果您喜欢旧行为,现在我们必须讨论&#34;默认默认值行为&#34;:即如果你没有设置你自己的默认值,Git会做什么。
我假设您没有设置很多精巧的Git配置旋钮,因此您将获得默认默认值。 (我认为这是因为您提到的细节:使用minGW GUI。)
假设您的Git版本至少为2.0 ,您通常会分两步完成。 (因为Git就是这样,你可以在一个任何版本的Git中完成所有这些,但是让我们分两个。)
你没有提到旧分支的名称(master
?)所以我在下面使用了oldbranch
,但是你需要使用任何实际的名字是。
git push -u origin newbranch
git push -f origin oldbranch
您实际上可以按任何顺序执行这些操作。
第一个命令git push -u origin newbranch
让你的Git在origin
调用另一个Git并向他们传递新的分支名称,以及任何与它一起使用的新提交(如果他们需要它们) 。 -u
标志意味着:&#34;我很确定这是一个新的分支给你;请创建或更新您的newbranch
,让我的分支与我的分支匹配,然后我将让我的上游。&#34; (有关&#34;上游和#34;的更多信息,请参阅其他问题。)由于此分支对他们来说是新的,因此他们将遵守您的礼貌请求,使用特定于该分支的一个提交创建新分支。
(那个提交指向旧分支上的所有旧提交,因此这些提交现在位于两个分支,在您的Git存储库和远程分支上。)< / p>
第二次推送,-f
或--force
,告诉你的Git再次调用另一个Git,告诉它(而不是礼貌地要求)移动将 oldbranch
带回到您搬回的地方。
我们必须强迫这种推动,因为他们通常会说&#34; no&#34;更礼貌的请求,因为失去了新的提交。但是你希望从旧分支中抛出提交。
(如果其他人在远程共享你的分支,这一步有点危险,因为你告诉他们的Git要抛出所有新提交,包括其他分享者可能提交的任何提交推了推。)
答案 3 :(得分:1)
对于你的问题:
git branch newbranch
和git reset --hard HEAD~1
)非常有效地满足您的要求(将最新提交从master分支移动到newbranch)。 git push -f origin master
git push origin newbranch
git checkout master
)。是的,推送后,本地和远程状态相同。