假设我做了最近的提交并将其推送到我的私有存储库,如何返回到要检出的分支,然后将其推送到存储库的主/主?
random.seed(0)
df = pd.DataFrame({col: [random.choice(list('abc')) for i in range(10)] for col in list('ABC')})
df['timestamp'] = pd.date_range('2016-1-1', periods=len(df))
df.sort_values('timestamp', inplace=True)
df['rank'] = \
df.groupby('A')['B'].transform(lambda group: group.astype('category').cat.codes + 1)
>>> df
A B C timestamp rank
0 c c a 2016-01-01 2
1 c b c 2016-01-02 1
2 b a c 2016-01-03 1
3 a c c 2016-01-04 1
4 b b b 2016-01-05 2
5 b a a 2016-01-06 1
6 c c b 2016-01-07 2
7 a c b 2016-01-08 1
8 b c c 2016-01-09 3
9 b c c 2016-01-10 3
我需要做什么命令才能将branch_name移动到master / head?
答案 0 :(得分:2)
提交并推送您的本地更改后。
git fetch
git pull
git checkout {目标分支名称}
与主人合并
git merge origin / master
答案 1 :(得分:0)
HEAD
应该在你的master
分支中,然后你必须写:
git merge branch_name
要回到历史记录中,您应该拥有要返回的提交的哈希值,然后:
git checkout commit_hash
答案 2 :(得分:0)
让我们看看我是否理解正确。
如果你想回到之前的提交,你会得到这个答案,详细说明该怎么做。
How to move HEAD back to a previous location? (Detached head)
如果您只是想结帐分行,您可以这样做:
# checkout the desired branch
git checkout <branch>
如果您希望查看所有分支机构并结帐其中一个分支机构:
# Update the repository with the list of all branches and deleted the
# one who were deleted on the remote
git fetch --all --prune
# List all branches in the repository
git branch -a
How to work on several branches simultaneously?
强> 您使用git worktree
命令在多个分支上同时 。
git worktree add <new_path>
git worktree
将创建2个单独的工作文件夹,彼此分开,同时指向同一个存储库。
这将允许您对enw工作树上的任何经验进行操作,而不会对存储库本身产生任何影响。
以下是有关如何创建新工作树的示例及其结果:
答案 3 :(得分:0)
基于此评论:
好吧,所以我签出my_branch,我添加更改并提交它,每当我执行git push origin master时,它都会说明所有内容都是最新的...每当我从其他远程计算机上拔出它时,我该怎么做我所做的改变拉了吗?
你需要的是一个很好的教程,真的,但遗憾的是有很多不好的教程而不是那么多好教程。我推荐the Pro Git book。不过,阅读和消化很多。
目前,让我们来看看你到目前为止所做的事情,并简要介绍一下他们所做的事情。让我们首先注意到这里至少涉及两个存储库,您的克隆,您使用git clone
创建的 - 以及您在名称{{1}下访问的其他计算机上的存储库}。几乎所有你在克隆中发生的事情,除了origin
(从你的克隆包中提交,将它们传递到远程,并要求远程更改其中一个分支名称以指向它们),以及git push
的一点(我们马上就会谈到这一点)。
首先:
git fetch
这告诉Git查找名称git checkout my_branch
,我们可以假设这是您的存储库中的现有分支。
假设成功,Git将my_branch
设置为指向HEAD
。名称my_branch
指向某个特定提交,因此我们有以下概念:
my_branch
其中...(some commits)<-o<-o <-- HEAD->my_branch
代表提交。每个提交都指向其父提交,o
指向最尖端(最右侧)这样的提交。然后,Git可以从my_branch
开始查找所有提交,看到它指向HEAD
,查看my_branch
指向的位置(提示提交),然后跟随每个提交到其父级。
接下来,添加/修改一些文件,可能删除一两个文件,最后提交:
my_branch
这会进行 new 提交。制作新提交的过程通常像往常一样阅读...
git add ...
...
git commit
,发现它指向HEAD
,阅读my_branch
以查找其提交(当前提示分支),然后从索引/暂存区域中的任何内容(上面提到的my_branch
的内容)中进行新的提交。最后一步,git调整git add
以指向 new 提交。
让我们再次绘制该图表,其中包含新的提交。让我们将新提交绘制为my_branch
而不仅仅是*
,以便我们可以轻松查看它是哪一个:
o
到目前为止一切顺利,但所有这些都严格地在您自己的存储库中,所以现在我们回答您关于...(some commits)<-o<-o<-* <-- HEAD->my_branch
的问题。事情变得有点复杂。
你跑了这个:
git push
但我们刚刚说过,并且上面提到git push origin master
指向HEAD
和my_branch
指向这个新的my_branch
提交。所有这些中*
在哪里?
好吧,我们之前没有提取它,而且我没有你的存储库,所以我不得不猜测。但我想假设master
指向{{1>} 曾经 master
的提示。为了绘制这个,我不能再绘制箭头了(它们不在我在StackOverflow上的字符集中),所以我只使用o
:
my_branch
这是与以前相同的图,除了(1)我必须使用两行和(2)我添加了\
分支。
当您运行...(some commits)<-o<-o <-- master
\
* <-- HEAD->my_branch
时,请让您的Git调用master
的Git并向其发送一些提交,即您在git push origin master
上提交的任何提交他们没有origin
。但是你和他们在master
上有相同的提交,所以你的git说&#34;一切都是最新的&#34;并停止。
您在此处拥有master
上的新提交。
(另外,新的提交在 master
和 my_branch
之前提交,至少在我刚刚制作的图纸中。我没有你的存储库,所以我只是猜测。但几乎可以肯定,一些提交都在两个分支上。与其他版本控制系统相比,Git是不寻常的。以后这一点非常重要,需要注意的事项是:提交可以在许多分支上进行。现在,这只是一个奇怪的事情。)
那么,你可以做些什么来让你的新提交到my_branch
?您可以做的一件事就是以名称master
推送它。如果origin
没有名为my_branch
的分支,则会在那里创建它。如果origin
有<{1}},则会尝试设置他们的my_branch
以指向您的新提交{{1}当然,首先提交该提交。无论哪种方式:
origin
或:
my_branch
将尝试该请求。他们的Git可以接受或拒绝该请求,并且通常会根据他们是否有一个名为my_branch
的分支(如果是的话,它现在指向的位置)这样做。
请注意*
中的重复。冒号git push origin my_branch:my_branch
字符左侧的名称是您的存储库中的分支名称,右侧的名称是您要求它们的名称 - 名为{的远程名称上的Git {1}} - 设置。这两个名字不一定相同!如果它们是相同的,你通常可以只编写一次,这就是我们用git push origin -u my_branch:my_branch
看到的内容。您也可以使用my_branch
执行此操作。我喜欢包括冒号和目的地名称,至少对新用户而言,因为我认为它会使事情变得更加明显。
您还可以执行以下任何操作:
my_branch:my_branch
上(根据您的存储库目前的情况,以多种方式之一);或:
的另一个甚至更新的提交中;或origin
)接受git push origin master
上的新提交,并将其添加到my_branch
。最后一个相当于做第一个,然后做master
。
master
上的新提交内容发送到(您的)origin
有两种方法可以做到这一点,可以做很多不同的事情。
my_branch
:这有两个主要的子模式。它可以做一个真正的合并,或者它可以做Git所谓的快进,这实际上根本不是合并。
master
:这有很多子模式,是一个非常敏锐的工具,如果误用会引起很多痛苦。我们将在这里讨论的模式(但实际上并没有使用)是要注意它的作用,在某种程度上,就像最后一步git push origin master
要求遥控器做的那样。它告诉Git从现在提交的任何提交中剥离分支标签,而是指向某些其他提交。
让我们首先看my_branch
,具体来说,&#34;剥离并更换标签&#34;操作。让我们再次绘制该图表:
master
首先,我们需要git merge
指向git reset
,我们照常使用git push
:
git reset
导致:
...(some commits)<-o<-o <-- master
\
* <-- HEAD->my_branch
现在,假设我们要运行HEAD
(实际上并没有这样做,只看看如果我们运行它会做什么)。这告诉git&#34;剥离当前的分支标签&#34; (阅读master
=&gt;它&#39; s git checkout
)&#34;关闭它现在指向的git checkout master
提交并使其指向与{{1相同的提交}}&#34 ;.也就是说,如果我们运行此命令,我们会得到:
...(some commits)<-o<-o <-- HEAD->master
\
* <-- my_branch
请注意,标签已移动,但没有其他更改 - 存储库中的提交仍然相同。
git reset --hard my_branch
现在让我们回到READ
。不幸的是,master
在进行真正的合并时是一个相当复杂的操作。幸运的是,o
做的第一件事就是检查它是否是一个非常简单的操作。
假设我们一直在绘制的图表是准确的,这个合并是一个简单的操作。特别是,my_branch
指向我们可以通过&#34;快速向前滑动标签&#34;,与所有箭头的方向相对应的提交,以便它指向提交...(some commits)<-o<-o
\
* <-- my_branch, HEAD->master
:
git merge
事实证明,这与git merge
会做的事情相同,但是因为git merge
首先检查以确定这是否是安全< / em>要做的事情,它是我们可能想在这里使用的命令。
让我们看一下不安全的情况,只是为了完整性。例如,假设我们实际上有这个:
git merge
在这种情况下,my_branch
将执行真正的合并,而*
只会在...(some commits)<-o<-o
\
* <-- my_branch, HEAD->master
上抛弃最终的git reset
提交。我们无法向前滑动标签,我们必须先将其备份,因此来自&#34; git merge
现在是&#34;到...(some commits)<-o<-o<-o <-- HEAD->master
\
* <-- my_branch
不是快进,而git merge
会进行真正的合并。
git reset --hard
最后,为了完整起见,我们来看看如何复制提交。
通常,要复制提交,我们使用o
。我们首先进入要将复制到的分支,例如master
:
master
然后运行my_branch
。这将找到git merge
指向(我们的git cherry-pick
提交)的提交并复制它,将副本添加到当前分支(阅读git cherry-pick
,请参阅master
,当前分支为...(some commits)<-o<-o<-o <-- HEAD->master
\
* <-- my_branch
,副本将添加到git cherry-pick my_branch
)。结果如下:
my_branch
其中*
是HEAD
的副本。
在所有这些情况下,我们现在可以master
将原始提交master
或其新副本master
推送到...(some commits)<-o<-o<-o<-x <-- HEAD->master
\
* <-- my_branch
,然后问x
将其*
重置为我们的新提交。
你提到&#34;拉扯&#34;。我建议将此作为两个单独的步骤重新学习,因为git push origin master
实际上只是这两个步骤:
*
x
(或者,通常更好的命令,origin
)它实际上是origin
步骤,在您的情况下与远程master
联系,并从中获取新内容。
获取操作会带来他们没有提交的提交(并且不会过度提交他们已经拥有的提交)。然后 - 这不是git pull
的镜像 - 您的git fetch
复制其分支信息,但重命名。他们的git merge
成为您的git rebase
;如果他们有git fetch
,则会成为您的origin
。
此重命名步骤对于允许您合并(或重新绑定)至关重要。如果抓取只是覆盖了你的分支,你将失去你做新提交的工作!
完成提取后,您可以将工作合并或重新绑定到您带来的新提交中。
我会将所有关于变基的描述留给其他帖子(或Pro Git书),但最后会加上这一点:除了更清楚地说明发生了什么之外,保留git push
的原因与第二步分开的是,这使您有机会决定使用哪个步骤。
如果您知道将使用git fetch
,则可以通过运行master
来合并这两个步骤。
如果您知道自己将运行origin/master
,则可以通过运行my_branch
(无标记)来合并这两个步骤。
但是,如果你想先看一下,然后决定怎么办?然后你需要使用两个单独的步骤,并插入&#34;看看,然后决定&#34;这两个步骤之间的部分。如果您从origin/my_branch
开始,则无法执行此操作。
(一旦你使用Git一段时间,你可能会知道在git fetch
之后你将使用哪个命令。实际上它通常可能是git rebase
- 你可以配置Git来使用{ {1}}自动。但是等到你使用Git一段时间后。)