git checkout分支然后将该分支设为head / master

时间:2016-04-29 00:31:23

标签: git

假设我做了最近的提交并将其推送到我的私有存储库,如何返回到要检出的分支,然后将其推送到存储库的主/主?

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?

4 个答案:

答案 0 :(得分:2)

提交并推送您的本地更改后。

git fetch

git pull

git checkout {目标分支名称}

与主人合并

git merge origin / master

答案 1 :(得分:0)

HEAD应该在你的master分支中,然后你必须写:

git merge branch_name

要回到历史记录中,您应该拥有要返回的提交的哈希值,然后:

git checkout commit_hash

Herehere您可以查看文档以获取更多信息。

答案 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 v2.5

git worktree add <new_path>

git worktree将创建2个单独的工作文件夹,彼此分开,同时指向同一个存储库。

这将允许您对enw工作树上的任何经验进行操作,而不会对存储库本身产生任何影响。

以下是有关如何创建新工作树的示例及其结果:

enter image description here

答案 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 指向HEADmy_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是不寻常的。以后这一点非常重要,需要注意的事项是:提交可以在许多分支上进行。现在,这只是一个奇怪的事情。)

你还能做什么:第1部分

那么,你可以做些什么来让你的新提交到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执行此操作。我喜欢包括冒号和目的地名称,至少对新用户而言,因为我认为它会使事情变得更加明显。

你可以做的更多其他事情:第2部分

您还可以执行以下任何操作:

  • 使您的新提交显示在my_branch:my_branch上(根据您的存储库目前的情况,以多种方式之一);或
  • 将您的新提交复制到您添加到:的另一个甚至更新的提交中;或
  • 请他们(origin)接受git push origin master上的新提交,并将其添加到my_branch

最后一个相当于做第一个,然后做master

如何将master上的新提交内容发送到(您的)origin

有两种方法可以做到这一点,可以做很多不同的事情。

  1. my_branch:这有两个主要的子模式。它可以做一个真正的合并,或者它可以做Git所谓的快进,这实际上根本不是合并。

  2. master:这有很多子模式,是一个非常敏锐的工具,如果误用会引起很多痛苦。我们将在这里讨论的模式(但实际上并没有使用)是要注意它的作用,在某种程度上,就像最后一步git push origin master要求遥控器做的那样。它告诉Git从现在提交的任何提交中剥离分支标签,而是指向某些其他提交。

  3. 让我们首先看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将其*重置为我们的新提交。

    pull vs fetch

    你提到&#34;拉扯&#34;。我建议将此作为两个单独的步骤重新学习,因为git push origin master实际上只是这两个步骤:

    1. *
    2. x(或者,通常更好的命令,origin
    3. 它实际上是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一段时间后。)