0

私はgitに比較的慣れていないので、マスターを壊したと思います。うまくいけば、誰かが私がそれを解くのを手伝ってくれることを願っています.

GitHub にマスターがあり、開発システムにローカル マスターと追跡ブランチがあります。私のQAシステムにもマスターがあります。

私の開発システムでは、ローカル ブランチをコミットして (ローカル) マスターにマージし、マスターを GitHub のオリジン/マスターにプッシュしました。次に、マスターを QA システムにプルしました。次に、ローカル ブランチにさらに変更を加えました。

私がしたことは:

dev branch -- merge --> dev master
dev master -- push --> GitHub master -- pull --> QA master

私はやるべきだったと思います:

dev **branch** -- push --> GitHub **branch** -- pull --> QA **branch**

そうですか?

今: コミット前に QA と GitHub マスターを元に戻したい...実際には、そのマージ全体を元に戻します。次に、(マスターではなく) ブランチを GitHub にプッシュし、ブランチを QA にプルします。

  1. QA および GitHub でマスターを元に戻すにはどうすればよいですか?
  2. 開発時にマスターも元に戻す必要がありますか?
  3. 開発時に行ったブランチの変更を保存するにはどうすればよいですか?

助けてください?

4

2 に答える 2

1

マスターにマージする代わりにブランチをプッシュする必要がありましたか?

それは良い質問です。コミットが非常に実験的なものである場合は、ブランチをプッシュしたほうがよいでしょう。そうではなく、コミットに高い信頼があれば、マスターへのマージは正しかったのです。必要がなければ、ワークスペースをリモート ブランチで汚染する必要はありません。

このコミットをブランチに切り替えて、リモートでプッシュしたいとしましょう。このシナリオのコミット グラフを描画します。

A-C-D
 \   \
  B---E < master, your_branch

master が B にあり、C & D が your_branch にあるとします。E は、2 つのマージ コミットです。あなたの質問に。ローカル リポジトリを修正し、特に GitHub を強制的に一致させることで、GitHub と QA のマスターを元に戻します。したがって、実際には、あなたの質問は逆の順序で回答するのが最善です.

まず、your_branch を修正します

git checkout your_branch
git reset --hard D

これにより、ブランチが D に移動し、次の結果が得られます。

A-C-D < your_branch
 \   \
  B---E < master

ここで、ローカル開発マスターを修正します

git checkout master
git reset --hard B

これにより、次のことが得られます。

A-C-D < your_branch
 \
  B < master

さようなら、不要なマージ コミット E.

GitHub (および QA) を修正する

git checkout master
git push -f

これにより、GitHub のマスターが強制的に B に戻されます。他の開発者と共同作業を行っていた場合、履歴を書き換えているため、開発者はこれを嫌うでしょう。しかし、これはおそらく共同作業のないあなたの個人的なリポジトリなので、それを試してください. リモートブランチを作成するには:

git checkout your_branch
git push origin your_branch

開発に合わせて GitHub が修正されたので、QA の更新は簡単です。

git checkout master
git pull
git reset --hard origin/master  # I'm assuming master will be on an orphaned commit after the pull
于 2014-02-14T07:23:18.327 に答える
0

私には、最初の質問は、開発ブランチが QA システムに到達するまでにすでに master にマージされているかどうかという個人的なワークフローの好みの問題のように思えます。あなたの現在の苦境について、私の(必ずしも最善ではない)提案:

  1. ローカル マスターではgit revert <merge-commit>、開発ブランチのマージによって導入された変更を元に戻します。ローカル マスターを押し上げます。それを QA に伝えます。この後、すべてのリポジトリのマスターは同じ履歴状態になるはずです。
  2. 上記の点に従って、リポジトリの一貫性を維持するために、そうします。
  3. 元に戻す前に、変更を隠しておきます (参照git stash)。元に戻すプロセス全体が完了したら、変更をポップします (参照git stash pop)。

お役に立てば幸いです。

于 2014-02-14T06:21:46.820 に答える