如何将文件从主分支推送到另一个分支?
Posted
技术标签:
【中文标题】如何将文件从主分支推送到另一个分支?【英文标题】:How to push files from master branch to another branch? 【发布时间】:2019-12-10 19:25:50 【问题描述】:我对使用 git 很陌生,所以我需要将文件从 master 分支推送到另一个分支,以便在出现问题时进行备份,然后继续在 master 分支上工作。我如何在 git bash 中做到这一点?
【问题讨论】:
从 master 中,您可以使用 git checkout -b new-branch 签出到新分支,以便 master 中的代码将存在于新分支中。现在再次向您的主人结帐并继续编辑 How do I copy a version of a single file from one git branch to another?的可能重复 @siva 所以,像这样。 git checkout -b new-branch 然后推送到那个新分支,然后 checkout -b old-branch? @Marko 在第二个命令中没有-b
,因为它是创建分支的选项(并且它已经存在)。但是恕我直言,创建标签而不是分支更有意义。
@Philippe 我收到错误'致命:当前分支备份没有上游分支。 '我
【参考方案1】:
Git 不推送文件;Git 推送提交。提交包含文件,因此效果相似,但重要的是要记住这一点:存储库有一个提交(然后有每个文件的快照),或者它没有提交(然后它没有那些快照)。
要将您在 master
上的提交推送到其他 Git 存储库(您称为 origin
的那个),但要让其他存储库通过(其)master
以外的名称知道它们,你可以这样做:
git push origin master:some-new-branch-name
这会向他们发送-origin
上的 Git-您拥有的任何提交,而他们不需要(但确实需要)。然后它会向他们发送一个礼貌的请求:请将您的分支设置为 some-new-branch-name
,以便它记住我调用 master
的提交。
(您的 Git 向他们发送此提交的原始哈希 ID,而不是名称 master
。如果您愿意,您可以查看原始哈希 ID:
git rev-parse master
尽管在您查看了一些原始哈希 ID 之后,您很快就会明白为什么人类不经常使用它们。除非你剪切和粘贴它们,否则它们太难做对了。)
完成上述操作后,如果运行:
git fetch origin
您将看到您现在有了一个新的远程跟踪名称origin/some-new-branch-name
。这是你的 Git 副本,它们的起源是 Git 的分支名称 some-new-branch-name
。如果你运行:
git log --all --decorate --oneline --graph
您会看到,您不仅拥有了这个新名称,而且它会将完全相同的提交标识为您自己的master
。
所有这些都有点愚蠢和/或矫枉过正,除非您担心您所做的某些事情实际上会破坏您的存储库。原因是一旦提交,提交是永久的——嗯,大部分是永久的——并且是只读的(完全只读:nothing 在任何提交中都可以ever 被改变!)。提交本身实际上是通过哈希 ID 找到的。像 master
这样的分支名称只是作为起点: 你的 Git 将你的名字 master
翻译成一个丑陋的大哈希 ID,并使用它来查找 last犯罪。最后一次提交具有其前一次或 父 提交的大而丑陋的哈希 ID,因此从最后一次提交开始,您的 Git 可以向后工作一步。父提交存储另一个父哈希 ID,以便从父提交,您的 Git 可以向后移动另一个步骤。该提交还有另一个父 ID:
... <-F <-G <-H ...
给定任何提交哈希 ID,例如提交 H
,Git 可以读取提交并获取其父 ID。然后它可以读取G
并获得另一个父ID,它可以使用它来读取F
,等等。 这就是分支: 它只是一系列提交,通过哈希 ID 向后串在一起,分支 name 指向该系列中的最后一个 。如果H
是最后一次提交,则系列如下所示:
...--F--G--H <-- master
name master
让你的 Git 找到提交 H
。这会让你的 Git 找到 G
,然后是 F
,依此类推。
当您向master
添加新提交时,Git 真正做的是写出一个新提交(带有一些新的随机哈希 ID),其 父 是提交 H
。然后 Git 将新提交的哈希 ID(我们称之为 I
)写入名称 master
,现在您有了:
...--F--G--H--I <-- master
当你创建一个新的名称,比如some-new-branch-name
,Git 只是创建这个名称,指向一些现有的提交。默认情况下,新名称的提交是 current 提交:
...--F--G--H--I <-- master, some-new-branch-name
这也解释了 Git 的 HEAD
是关于什么的。如果您有多个分支名称,Git 如何知道在您进行新提交时要更新 哪个名称?答案是:Git 将特殊名称 HEAD
附加到其中一个分支名称上。这是您进行新提交时要更新的名称。所以我们真的应该把它画成:
...--F--G--H--I <-- master (HEAD), some-new-branch-name
或:
...--F--G--H--I <-- master, some-new-branch-name (HEAD)
取决于您使用git checkout
选择的分支名称。当前commit是I
的(真正的hash ID);当前的分支名称是HEAD
所附加的名称。
如果您担心文件,只需使用 git checkout -b
创建一个新的分支名称,如果需要,提交(或者如果您希望先将更改添加到另一个分支,则先提交,如果这样更合适的话) .您之前的分支名称现在会记住 its 上次提交的哈希 ID,而您的新分支名称会记住您所做的任何 new 提交的哈希 ID:
...--F--G--H--I <-- master
\
J--K <-- some-new-branch-name (HEAD)
(一旦你有两个只在新分支上的提交)。
(请注意,通过I
的提交都在两个 分支上。)
【讨论】:
这是一个很好的答案 - 你知道如何为 master (for git push --all) 永久设置默认远程分支,因为 "push -u" 没有: git push -u " origin" "master:RELEASE12345" # 不会永久设置如果在 .git/config 中有需要手动编辑的内容,我对此很满意。 那……有点乱。 有一种方法可以告诉 Git 推送到branch@upstream
设置 - 请注意,git push -u ...
本质上是告诉 Git 如果推送成功则运行 git branch --set-upstream-to
- 使用 @ 的 push.default
设置987654369@,但此默认设置仅适用于某些情况。见(很长)git config
documentation;搜索push.default
。【参考方案2】:
首先,您需要为这些备份创建一个新分支(但我认为不需要这样做,因为您也可以返回在 master 分支中所做的任何提交,但没关系)。
在本地创建新分支
要创建一个新分支,只需使用:
git branch <NAME OF NEW BRANCH>
或者在这种情况下,我们可以使用
git branch backup
之后,我们需要切换到那个分支
git checkout <NAME OF NEW BRANCH>
或者在这种情况下,我们将使用
git checkout backup
之后,我们需要提交更改
添加所有新文件(点替换当前未添加到提交的所有文件)
git add .
然后做一个提交
git commit -m "adding a backup branch"
然后我们去master分支
git checkout master
然后将这些更改推送到 git repo
git push origin <feature_branch>
在这种情况下
git push origin backup
将新文件从主分支推送到备份分支
如果你想在分支备份中有新文件作为基础,你可以使用
git rebase master
这将更新您在备份分支中的基本提交。你可以在这里阅读更多关于 rebase 的内容https://git-scm.com/book/de/v2/Git-Branching-Rebasing
【讨论】:
git checkout -b 'branch_name' 将同时创建不存在的分支。以上是关于如何将文件从主分支推送到另一个分支?的主要内容,如果未能解决你的问题,请参考以下文章