我可以从特定的分支中提取一些文件,修改它们并将它们推送到同一github存储库中的另一个分支吗?

我可以从特定的分支中提取一些文件,修改它们并将它们推送到同一github存储库中的另一个分支吗?,git,github,Git,Github,我尝试了一些随机文本文件,我在github上创建了这些文件,在我的计算机上拉取它们,修改它们,然后我在github上创建了一个单独的分支,称为“另一个”。当我尝试使用git将修改后的文件从我的计算机推送到github时,我收到了以下消息: error: src refspec another does not match any<br> error: failed to push some refs to 'https://github.com/username/repo-name.

我尝试了一些随机文本文件,我在github上创建了这些文件,在我的计算机上拉取它们,修改它们,然后我在github上创建了一个单独的分支,称为“另一个”。当我尝试使用git将修改后的文件从我的计算机推送到github时,我收到了以下消息:

error: src refspec another does not match any<br>
error: failed to push some refs to 'https://github.com/username/repo-name.git'
错误:src refspec other不匹配任何
错误:无法将某些引用推送到'https://github.com/username/repo-name.git'
我以前键入的内容:
git将原点推到另一个
首先移动到分支
另一个

git checkout another
然后从另一个分支复制文件(本例中为master)

然后按下
另一个
分支

git add *
git commit -m "message"
git push origin another
Git实际上不是关于文件的,
Git pull
不拉文件。然而,你可能会实现你可能想要的。这里真正的问题在于在Git的上下文中找出您想要的内容,Git存储的是提交,而不是文件

不过,首先,让我们谈谈这条信息:

这意味着您没有名为
另一个
的分支。考虑到你刚才所说的,这是有道理的:

我[创建]了一些随机文本文件。。。在github上

现在还不完全清楚您是如何做到这一点的(请参阅),但让我们假设这在GitHub上创建了一个或多个新提交,每个提交都在某个分支上-
master
main

。。。把它们放在我的电脑上

让我们假设您在这里运行:

git pull
在第一次使用创建的存储库中:

git克隆
其中指定的
url
是一个包含Git的url,在您的计算机上,与GitHub的计算机进行对话,以从GitHub存储库获取提交,并将提交放到GitHub存储库中。这
git pull
将从您的GitHub存储库获得提交。这些提交将包含您创建的文件。这些提交在它们所在的任何分支上(任何给定的提交都可以在这里的一个或多个分支上,甚至在某些情况下,尽管没有分支上的提交不是这个)。假设您在这里使用的是新的
main
分支名称,因此这些新提交位于
main
(而不是任何其他分支)

在“获取新提交”步骤(
git fetch
)之后,
git pull
运行您选择的第二个git命令。如果您不告诉它,那么第二个命令将是
gitmerge
。在本例中可能适用的条件下,这个
git merge
将执行git所称的快进合并,这在技术上根本不是合并。结果是,您的计算机上的
main
分支或Git存储库中的任何名称现在与GitHub上的
main
分支或存储库中的任何名称同步

(这里我们需要相当精确,否则这些东西都不起作用,正如您刚才看到的。)

[一] 修改了[这些文件在本地],然后我在github上创建了一个单独的分支,称为“另一个”

请注意,在快进操作之后,Git存储库将具有与GitHub存储库相同的提交。您自己的Git将再次在本地更新的分支名称上运行
Git checkout
,我仍然假设它在这里命名为
main
,尽管它可能是
master
或其他名称

git checkout
步骤创建或更新了您看到和修改的可见和可编辑文件。这些文件不在存储库中。要将它们放入存储库,必须在本地运行
git add
git commit
。这将创建一个新的提交。提交是存储库中的内容

你没有提到做过那件事,所以我想你没有。在你拥有之前,这些文件只是你电脑上的文件。它们根本不存储在Git中。他们只是为你工作。您需要执行
git add
git commit
步骤来进行新的提交

同时,让我们回到这一点:

然后我在github上创建了一个单独的分支,称为“另一个”

这在GitHub上,在那边的另一个存储库中创建了一个分支。它对您的存储库没有影响。因此,您没有名为
另一个
的分支

当我试着推的时候

我们必须猜测你使用了什么命令,因为你没有告诉我们,但大概是:

git push origin another
这是合理的,但会立即给你刚才看到的错误,因为我们已经注意到你没有这样的分支

处理Git有点混乱和复杂 这是因为分布式源代码控制从根本上说是复杂的

Git的方法是在提交方面工作。每次提交都有一些有趣的属性:

  • 每次提交都进行编号。这些数字并不是简单的连续数字,Git不会将其设置为commit#1,然后再设置为commit#2,依此类推,而是看起来随机但根本不是随机的散列ID。散列ID是每个提交内容的加密校验和,并保证对该特定提交是唯一的。(例如,为了帮助实现这一点,Git在每次提交时都会添加日期和时间戳。)

  • 每个提交都有两个部分:

    • 一部分是每个文件的完整快照。这些文件以压缩、只读和消除重复的格式存储,因此,如果您有许多文件,但只更改了一个,那么您所做的新提交将重新使用所有其他文件。这节省了很多空间。然而,这确实意味着任何人都不能更改任何提交的文件。(这也由编号方案强制执行。)

    • 每个提交的另一部分是元数据,即关于提交本身的信息。例如,这包括您的姓名和电子邮件地址。它包括我提到的日期和时间戳。包括
      git pull
      
      git push origin another
      
      ... <-F <-G <-H
      
      ...--F--G--H   <-- main
      
      ...--F--G--H   <-- main
      
      ...--F--G--H--I   <-- main
      
      ...--G--H   <-- main
      
      ...--G--H   <-- develop, main
      
      ...--G--H   <-- develop, main (HEAD)
      
      ...--G--H   <-- develop (HEAD), main
      
      ...--G--H   <-- main
               \
                I   <-- develop (HEAD)
      
      ...--G--H   <-- main
               \
                I--J   <-- develop (HEAD)
      
                I--J   <-- develop
               /
      ...--G--H   <-- feature (HEAD), main
      
                I--J   <-- develop
               /
      ...--G--H   <-- main
               \
                K--L   <-- feature (HEAD)
      
                   J   <-- feature
                  /
      ...--G--H--I   <-- main (HEAD)
      
      ...--G--H--K   <-- main (HEAD)
      
                   J   <-- feature
                  /
      ...--G--H--I   <-- main (HEAD)
               \
                K
      
      ...--G--H--I--J   <-- feature
               \
                K   <-- main (HEAD)
      
                   J   <-- feature
                  /
      ...--G--H--I   <-- main (HEAD)
               \
                K   <-- origin/main
      
      ...--G--H   <-- main (HEAD), origin/main
      
      ...--G--H   <-- main (HEAD)
               \
                I   <-- origin/main
      
      ...--G--H--I   <-- main (HEAD), origin/main
      
                   J   <-- main (HEAD)
                  /
      ...--G--H--I   <-- origin/main
      
      git push origin main
      
      ...--G--H--I--J   <-- main (HEAD), origin/main
      
      ...--G--H   <-- main (HEAD), origin/main
      
      ...--G--H   <-- main, origin/main
               \
                I--J   <-- another (HEAD)
      
      git push origin another
      
      ...--G--H   <-- main, origin/main
               \
                I--J   <-- another (HEAD), origin/another
      
      git branch --set-upstream-to=origin/another another
      
      git fetch
      git merge
      git pull
      git push
      
      git fetch origin
      
      ...--G--H   <-- main (HEAD), origin/main
      
      ...--G--H   <-- main (HEAD)
               \
                I--J   <-- origin/main
      
      ...--G--H--I--J   <-- main (HEAD), origin/main
      
      ...--G--H--I--J   <-- main (HEAD), origin/another, origin/main
      
      ...--G--H--I--J   <-- another (HEAD), main, origin/another, origin/main
      
      git push