9

問題:

変更をローカル git ブランチから別のリモート git リポジトリ ブランチにプッシュする必要があります。ブランチにプッシュされたこの変更は、リモート URL に存在するマスターと比較され、変更がマージされます。

手順

これまでのところ、ローカルの git リポジトリの作成に従っています。

以下のようなコマンドを使用して、以下を使用して単純なローカル git リポジトリを初期化しました。

 git init

既存のファイルをレポに追加し、以下のコマンドを使用してステージング領域に追加します。

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 のマスターと比較され、すべてが正常であればマスターとマージされることです。したがって、私は常に変更をローカル ブランチからリモート ブランチにのみプッシュします。

これを開始したときにクローン URL が提供されず、ソースのみが提供されたために問題が発生したため、ローカルの git リポジトリを作成し、リポジトリ URL が提供され、変更をブランチにプッシュするように求められたので作業を開始しました。

知りたいのですが、これは最初のケースで可能ですか?.可能であれば、それを機能させるために必要なコマンドを教えてください.

4

3 に答える 3

4

この大失敗を修正するには(私も以前にこれらの問題を抱えていました。それらは非常に面倒です)、次のことを試すことができます。

あなたの状況

メインリポジトリ

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

あなたのリポジトリ

            A'-B'-C'-D'

のコードGは local のコードとA'同じですが、同じ履歴を共有していません

変更をプッシュするリポジトリをクローンします

git clone https://....

これにより、コードベースの作業コピーが提供され、さらに重要なことに、その履歴も提供されます。

メインリポジトリのクローン

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

レポとは別のフォルダーに

            A'-B'-C'-D'

めちゃくちゃになったリポジトリから機能ブランチを取得します。

git fetch ../messed-up-repo

../messed-up-repo2 番目のリポジトリへのパスはどこにありますか。

これにより、マージせずに、他のレポからすべての変更がプルされます。これは、ブランチがマスター ブランチと共通の祖先を見つけられないためです。したがって、それらをマージすることは困難であるか、不可能でさえあるでしょう。

メインリポジトリは次のようになります。

 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 に答える