9

问题:

需要将本地 git 分支的更改推送到不同的远程 git 存储库分支,推送到该分支的更改将与远程 URL 中存在的 master 进行比较,更改将被合并。

脚步

到目前为止,我一直在创建一个本地 git 存储库,

使用下面的命令初始化一个简单的本地 git repo,

 git init

将现有文件添加到 repo 并使用以下命令将它们添加到暂存区域,

MacBook-Pro: $ git add *.h
MacBook-Pro: $ git add *.m

使用以下命令检查状态,

MacBook-Pro: $ git status

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   test.h
#   new file:   test.m
#

承诺他们,

git commit -m"Added test base files"

现在创建了一个名为 issue_fix 的新分支,

   MacBook-Pro:$ git branch issue_fix

通过检查分支开始在分支上工作。

MacBook-Pro: $ git checkout issue_fix

很少向分支提交。一切都很好。

现在我的情况是,我需要将我对“issue_fix”分支所做的更改推送到这样的远程存储库 URL

    https://github.com/myaccountname/project.git

我的更改将被推送到给我的分支名称,或者如果该分支不可用,我需要创建一个远程分支并将本地分支中的更改推送到该分支。

最重要的是,推送的更改将与给定存储库 URL 中的 master 进行比较,如果一切正常,它将与 master 合并。因此,我将始终仅将更改从本地分支推送到远程分支。

出现问题是因为在我开始时没有给出克隆 URL,只提供了源,所以我创建了一个本地 git 存储库并开始处理,现在已经提供了存储库 URL 并要求将我的更改推送到分支。

我想知道,在第一种情况下这可能吗?如果可能,请给我需要给出的命令以使其正常工作。

4

3 回答 3

5

Git 是分布式的,并且在本地进行大部分操作;当您在本地创建分支或提交时,远程是否存在并不重要。当你推动它时,它必须存在。

因此,您可以添加远程存储库,然后将您的分支推送到它。如果分支不存在,它将被远程创建。

git remote add github-repo https://github.com/myaccountname/project.git
git push github-repo issue_fix
于 2013-07-09T09:19:05.643 回答
4

要解决这个问题(我以前也遇到过这些问题。它们很烦人),您可以尝试执行以下操作:

你的情况

主存储库

A-B-C-D-E-F-G-H

您的存储库

            A'-B'-C'-D'

其中的代码G与您本地的代码相同A',但它们不共享相同的历史记录

克隆要将更改推送到的存储库

git clone https://....

这将为您提供代码库的工作副本,更重要的是,还提供其历史。

主存储库的克隆

A-B-C-D-E-F-G-H

在与您的存储库不同的文件夹中

            A'-B'-C'-D'

从混乱的存储库中获取您的功能分支。

git fetch ../messed-up-repo

../messed-up-repo第二个存储库的路径在哪里。

这将从其他 repo 中提取所有更改,而不合并它们。这样做的原因是因为您的分支不会与主分支找到共同的祖先,因此很难甚至不可能合并它们。

主存储库现在将如下所示:

 A-B-C-D-E-F-G-H                       # master
/
\
 ------------A'-B'-C'-D'               # messy

创建一个新分支

git branch new-featurebranch aabbccdd

aabbccdd下载存储库时的提交 ID 在哪里。这将在您当时下载的提交处创建一个新分支。你越能猜出这个值,你以后的冲突就越少。

                -                        # new branch
              /
 A-B-C-D-E-F-G-H                         # master
/
\
 ------------A'-B'-C'-D'                 # messy

以交互方式将您的分支变基到它上面

git checkout messy-featurebranch
git rebase -i new-featurebranch

这将显示一个编辑器,其中包含您分支中所有提交的列表。第一个可能是“我下载了代码的副本,但没有正确克隆它”提交。删除该行。然后所有其他提交应无缝应用。

               -B'-C'-D'                 # new branch
              /
 A-B-C-D-E-F-G-H                         # master
/
\
 ------------A'                          # messy
于 2013-07-09T09:28:47.043 回答
0

由于它似乎是一个非常少的版本,我建议只克隆主仓库(在一个新目录中),然后用你自己的文件覆盖他们的文件并进行新的提交。

否则没有“简单的方法”可以做到,但也许有一些提示:

  1. 将主仓库克隆到一个新目录中https://github.com/myaccountname/project.git
  2. 将您的旧工作副本添加为远程:git remote add old /path/to/old/repo/
  3. git fetch` 将导入您的所有修改

现在有几个选项,根据最适合您的选择:git cherry-pick <1st sha1 you want>..<last commit (probably old/issue_fix)>似乎符合您的需求,但如果不是,您可以尝试git rebase --interactiveNils,但如果您所做的第一次提交不是空提交,您可能会遇到问题。

于 2013-07-09T12:57:43.143 回答