mrm*_*mar 3 git git-bash git-branch
我对使用 git 相当陌生,所以我需要将文件从 master 分支推送到另一个分支,以便在出现问题时进行备份,然后继续在 master 分支上工作。我如何在 git bash 中做到这一点?
Git 不推送文件;Git 推送提交。提交包含文件,所以效果是相似的,但重要的是要记住这一点:存储库要么有提交(然后有每个文件的快照),要么没有提交(然后它没有有那些快照)。
要将您的提交推master送到某个其他 Git 存储库(您调用的origin那个),但让其他存储库通过 (its) 以外的名称了解它们master,您可以执行以下操作:
git push origin master:some-new-branch-name
Run Code Online (Sandbox Code Playgroud)
这会将它们发送给他们origin——Git 继续——你拥有的任何提交,他们没有(但确实需要)。然后它向他们发送一个礼貌的请求:请设置您的分支命名,some-new-branch-name以便它记住我调用的提交master。
(您的 Git 向他们发送此提交的原始哈希 ID,而不是 name master。如果您愿意,可以使用以下命令查看原始哈希 ID:
git rev-parse master
Run Code Online (Sandbox Code Playgroud)
尽管在您查看了一些原始哈希 ID 之后,您很快就会明白为什么人们很少使用它们。除非你剪切和粘贴它们,否则它们很难做到正确。)
完成上述操作后,如果您运行:
git fetch origin
Run Code Online (Sandbox Code Playgroud)
你会看到你现在有了一个新的远程跟踪名称 origin/some-new-branch-name。这是你的 Git 的副本——起源的——Git 的分支名称some-new-branch-name。如果你运行:
git log --all --decorate --oneline --graph
Run Code Online (Sandbox Code Playgroud)
您会看到,您不仅拥有这个新名称,而且它标识的提交与您自己的master.
所有这些都有些愚蠢和/或矫枉过正,除非您担心您所做的某些事情实际上会破坏您的存储库。其原因是,提交,一经作出,是永久的井,大多是永久和只读(完全只读:没有在任何承诺可以永远!改变)。提交本身实际上是通过哈希 ID 找到的。像这样的分支名称master只是作为起点:您的 Git 将您的名称master转换为一个大而难看的哈希 ID,并使用它来查找最后一次提交。最后一次提交具有其前一个或父项提交,因此从上次提交开始,您的 Git 可以向后工作一步。父提交存储另一个父哈希 ID,以便从父提交,您的 Git 可以向后移动一步。该提交还有另一个父 ID:
... <-F <-G <-H ...
Run Code Online (Sandbox Code Playgroud)
给定任何提交哈希 ID,就像 commit 一样H,Git 可以读取提交并获取其父 ID。然后它可以读取G并获取另一个父 ID,它可以用来读取F,依此类推。 这就是分支: 它只是一系列提交,通过哈希 ID 向后串联在一起,分支名称指向系列中的最后一个。如果H是最后一次提交,则该系列如下所示:
...--F--G--H <-- master
Run Code Online (Sandbox Code Playgroud)
该名称 master让您的 Git 找到 commit H。这让您的 Git 可以找到G,然后F,等等。
当您向 中添加新提交时master,Git 真正做的是写出一个新提交(带有一些新的随机哈希 ID),其父项是 commit H。然后 Git 将新提交的哈希 ID(让我们称之为)写入Iname master,现在您拥有:
...--F--G--H--I <-- master
Run Code Online (Sandbox Code Playgroud)
当您创建一个新名称时,例如some-new-branch-name,Git 只会创建该名称,指向某个现有提交。默认情况下,新名称的提交是当前提交:
...--F--G--H--I <-- master, some-new-branch-name
Run Code Online (Sandbox Code Playgroud)
这也解释了 Git 的含义HEAD。如果您有多个分支名称,当您进行新的提交时,Git 如何知道要更新哪个名称?答案是:Git 将特殊名称附加HEAD到分支名称之一。这是您进行新提交时要更新的名称。所以我们真的应该把它画成:
...--F--G--H--I <-- master (HEAD), some-new-branch-name
Run Code Online (Sandbox Code Playgroud)
或者:
...--F--G--H--I <-- master, some-new-branch-name (HEAD)
Run Code Online (Sandbox Code Playgroud)
这取决于分支名称你选择git checkout。当前提交是(的真实哈希ID)I;当前分支名称HEAD是附加到的任何名称。
如果您担心文件,只需使用git checkout -b, 和,如果需要,提交一个新的分支名称(或者,如果您希望首先将更改添加到另一个分支,如果更合适,请先提交)。您之前的分支名称现在会记住其上次提交的哈希 ID ,而您的新分支名称会记住您所做的任何新提交的哈希 ID :
...--F--G--H--I <-- master
\
J--K <-- some-new-branch-name (HEAD)
Run Code Online (Sandbox Code Playgroud)
(一旦您有两个仅在新分支上的提交)。
(请注意,提交通过I在两个分支上。)
| 归档时间: |
|
| 查看次数: |
3201 次 |
| 最近记录: |