問題タブ [git-merge]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
git - コミットをつぶすだけなのに、なぜ git-rebase でマージの競合が発生するのですか?
私たちの Git リポジトリには 400 件以上のコミットがあり、最初の数十件は試行錯誤の連続でした。多くのコミットを 1 つのコミットにまとめることで、これらのコミットをクリーンアップしたいと考えています。当然、git-rebase が適しているようです。私の問題は、マージの競合が発生し、これらの競合を解決するのが容易ではないことです。コミットを押しつぶすだけなので(削除や再配置ではなく)、なぜ競合が発生するのかまったくわかりません。おそらく、これは git-rebase がどのようにスカッシュを行うかを完全には理解していないことを示しています。
私が使用しているスクリプトの修正版は次のとおりです。
repo_squash.sh (これは実際に実行されるスクリプトです):
repo_squash_helper.sh (このスクリプトは repo_squash.sh でのみ使用されます):
repo_squash_list.txt: (このファイルは repo_squash_helper.sh でのみ使用されます)
「新着メッセージ」の内容はご想像にお任せします。最初は、「--strategy theirs」オプションなしでこれを行いました (つまり、デフォルトの戦略を使用します。ドキュメントを正しく理解している場合は再帰的ですが、どの再帰戦略が使用されているかわかりません)。動作しません。また、repo_squash_helper.sh のコメントアウトされたコードを使用して、sed スクリプトが動作する元のファイルを保存し、それに対して sed スクリプトを実行して、それが意図したとおりに動作していることを確認しました (そうだった)。繰り返しますが、なぜ競合が発生するのかさえわからないため、どの戦略が使用されるかはそれほど重要ではないようです。アドバイスや洞察は役に立ちますが、ほとんどの場合、この押しつぶしを機能させたいだけです。
Jefromi との議論からの追加情報で更新:
大規模な「実際の」リポジトリに取り組む前に、テスト リポジトリで同様のスクリプトを使用しました。これは非常に単純なリポジトリであり、テストは問題なく動作しました。
失敗したときに表示されるメッセージは次のとおりです。
これは、最初のスカッシュ コミット後の最初の選択です。実行git status
すると、クリーンな作業ディレクトリが生成されます。次に を実行するgit rebase --continue
と、さらに数回コミットした後、非常によく似たメッセージが表示されます。その後、もう一度実行すると、数十回コミットした後に、非常によく似た別のメッセージが表示されます。もう一度実行すると、今度は約 100 回のコミットが行われ、次のメッセージが表示されます。
次に を実行するgit status
と、次のようになります。
これは単なる選択の結果であるため、「両方が変更されました」というビットは私には奇妙に聞こえます。また、「競合」を見ると、[タブ] 文字で始まるバージョンと 4 つのスペースで始まるバージョンの 1 つの行に要約されることも注目に値します。これは、構成ファイルの設定方法に問題があるように聞こえましたが、そのようなものは何もありません。(core.ignorecase が true に設定されていることに注意しましたが、明らかに git-clone が自動的にそれを行ったようです。元のソースが Windows マシン上にあったことを考えると、まったく驚かないでしょう。)
file_X.cpp を手動で修正すると、その後すぐに別の競合が発生して失敗します。今回は、あるバージョンが存在すると見なすファイル (CMakeLists.txt) と、あるバージョンが存在しないと見なすファイル (CMakeLists.txt) の間です。このファイルが必要だと言ってこの競合を修正すると (私はそうします)、いくつかのコミットの後で (この同じファイルで) 別の競合が発生し、かなり重要な変更が加えられます。紛争の解決までの道のりは、まだ約 25% にすぎません。
これは非常に重要なことかもしれないので、このプロジェクトは svn リポジトリで始まったことも指摘しておく必要があります。その最初の履歴は、その svn リポジトリからインポートされた可能性が非常に高いです。
更新 #2:
ひばりで (Jefromi のコメントの影響を受けて)、repo_squash.sh を次のように変更することにしました。
そして、元のエントリをそのまま受け入れました。つまり、「リベース」は何かを変えるべきではありませんでした。先ほど説明したのと同じ結果になりました。
更新 #3:
または、戦略を省略して最後のコマンドを次のように置き換えると:
「コミットするものが何もない」リベースの問題はもうありませんが、他の競合はまだ残っています。
問題を再現するおもちゃのリポジトリで更新します。
test_squash.sh (これは実際に実行するファイルです):
test_squash_helper.sh (test_sqash.sh で使用):
PS: はい、私が emacs をフォールバック エディターとして使用しているのを見て、うんざりする方もいらっしゃると思います。
PPS: リベース後に既存のリポジトリのすべてのクローンを吹き飛ばさなければならないことはわかっています。(「公開後にリポジトリをリベースしてはならない」という行に沿って。)
PPPS: これに報奨金を追加する方法を誰か教えてもらえますか? 編集モードでも表示モードでも、この画面のどこにもオプションが表示されません。
git - gitのマージコミットメッセージをカスタマイズするにはどうすればよいですか?
マージを行うたびに、マージコミットを生成する必要があり、すべてのコミットの要約以上のものが必要です。
私の質問は、git-fmt-merge-msgをフォーマットする方法、またはこの自動メッセージを決定するものです(コミット後に、メッセージを修正してgit-log --pretty = format:'...'を使用することにより、手動でこれを行うことができます)
たとえば、次のようにフォーマットしたいと思います。
git - gitステータス「Unmergedpaths:」を解決する方法は?
dog
ブランチをにマージしましanimal
た。コミットしようとすると、次のようになります。
ブランチごとに異なるディレクトリ名とファイル名がありました。animal
ブランチには私が望む変更があります。
ヘッドをリセットしようとすると動作しません。そして、他のgitアクション(削除、チェックアウトなど)を実行しようとすると、path not found
エラーが発生します。
これを解決するには、どのコマンドを実行する必要がありますか?
git - チェックアウトを使用せずにGitブランチをマージ、更新、プル
私は、AとBの2つのブランチを持つプロジェクトに取り組んでいます。通常、ブランチAに取り組んでおり、ブランチBからのものをマージします。マージには、通常、次のようにします。
ただし、ブランチAと最初にマージせずにブランチをチェックアウトすることがあるため、ブランチBのローカルコピーも保持したいと思います。これには、次のようにします。
ブランチを前後に切り替えることなく、1つのコマンドで上記を実行する方法はありますか?そのために使用する必要がありgit update-ref
ますか?どのように?
git - gitを使用して、すでにマージされているリポジトリをマージするにはどうすればよいですか?
変更をプルしたリポジトリがあるので、リモートリポジトリで最新の状態になりました。それを除いて、私はそのリポジトリの変更をすべてプルし、私のものを保持する必要がないことに気づきました。引っ張ったときに「すでに最新」にならないように、履歴に戻りたいです。また、パート2では、自分の変更を一切行わずに、すべての変更をプルして取得するにはどうすればよいですか?
git - Git MergeRecursiveOurs-コマンド構文の例
再帰的な戦略とのgitマージの正しい形式は何ですか?(git merge ours戦略と混同しないでください)
http://www.kernel.org/pub/software/scm/git/docs/git-merge.html
たくさんの方法を試しましたが、うまくいかないようです。
git - master を常にマージする必要がある git ブランチのベスト プラクティスは何ですか?
基本的にマスターと「次のバージョン」の2つのブランチを持つプロジェクトに取り組んでいます。
2つは常に変更されており、次のバージョンにはマスターからの最新の変更が必要ですが、一方のバージョンが公開され、もう一方のバージョンがまだアルファ版であるため、両方をマージすることはできません.
現在、変更が発生するたびにマスターを次のバージョンにマージしていますが、これは醜い歴史につながります.
この場合のベストプラクティスは何ですか?
git - Git マージ - 簡単なマージ?
ベースとソースのファイル コンテンツが同じで、宛先ブランチ/レポに他のファイルの変更がある場合、ソース ファイルと宛先ファイルのどちらのコンテンツが保持されますか?
詳しく説明すると
ファイルが A->B エッジで追加され、B->C エッジで再び削除され、B->D エッジでそのまま残されたとします。
CとDをマージしたい。
C と D をマージするときに、共通の祖先が変更のない A である場合 (したがって、A、C にはファイルがなく、B、D にはファイルがあります)。
C (宛先) が D からマージされるとどうなりますか?
D (宛先) が C からマージされるとどうなりますか?
git - Git コミットが Merge/Revert コミットかどうかを判断する
特定のコミットが Merge/Revert コミットであるかどうかを確認する必要があるスクリプトを書いていますが、そのための git トリックがあるかどうか疑問に思っています。
これまでに思いついたのは (そして、ここでコミット メッセージに依存したくないことは間違いありません) HASH^2
、エラーが発生しないかどうかを確認することです。より良い方法はありますか?
git - git の「些細な競合」を解決するためのツール
競合を防ぎ、マージを高速化するのに役立つ git コマンドのツール/スイッチを知っていますか?
現在、次のような「些細な競合」が頻繁に発生します。
これはいくつかの空白が原因であると思います..これは人間が解決するのは非常に簡単ですが、そのような競合をすべて解決するには多くの時間が必要です.
この種の競合を自動的に解決できるツールはありますか?
PS。私はまだ英語を学んでいますが、時々ばかげた間違いを犯します。質問と回答を英語で書くように最善を尽くしていますが、間違いがあれば投稿を編集していただければ幸いです。あなたの努力は無駄にはなりません。