問題タブ [git-branch]
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 がデフォルトで早送りマージを実行するのはなぜですか?
Mercurial から来て、ブランチを使用して機能を整理しています。当然、自分の歴史にもこのワークフローを見たいと思っています。
git を使用して新しいプロジェクトを開始し、最初の機能を完成させました。機能をマージするとき、git が早送りを使用していることに気付きました。つまり、可能であれば変更をマスター ブランチに直接適用し、私のブランチは忘れてしまいます。
将来を考えると、このプロジェクトに取り組んでいるのは私だけです。git のデフォルトのアプローチ (早送りマージ) を使用すると、私の履歴は 1 つの巨大なマスター ブランチになります。最終的には巨大な master ブランチしかないので、機能ごとに個別のブランチを使用したことを誰も知りません。それは専門外に見えませんか?
この理由から、私は早送りマージを望んでおらず、それがデフォルトである理由がわかりません。それについて何がそんなに良いのですか?
git - Git のマスター ブランチを別のブランチから完全に置き換える方法は?
Git リポジトリに 2 つのブランチがあります。
master
seotweaks
(元は から作成master
)
seotweaks
にすばやくマージすることを意図して作成しましたmaster
。ただし、これは 3 か月前のことであり、このブランチのコードは より 13 バージョン進んでmaster
います。
のすべてのコードがmaster
多かれ少なかれ時代遅れになっているため、これは事実上、私たちの作業マスター ブランチになりました。
私が知っている非常に悪い習慣、教訓。
master
ブランチのすべてのコンテンツを のコンテンツに置き換える方法を知っていますseotweaks
か?
すべてを削除しmaster
てマージすることもできますが、これはベスト プラクティスとは思えません。
git - 直接関係のないブランチをマージ/リベースすることは可能ですか?
統合テストとして、マスターとマージする前にいくつかのブランチに参加したいと思います。
それらはすべてマスターから分岐し、独自の方法を作成します。直接的な関係(親/子など)のない異なるブランチをマージするのは正しいですか??
ブランチに再参加するための良い習慣はありますか??
前もってありがとう、ラウル。
git - ブランチがローカルで追跡されたブランチまたはユーザーが作成したローカル ブランチであるかどうかを確認する方法は?
「git branch -b branch-name origin/branch-name」を使用して、リモート トラッキング ブランチをローカル リポジトリでローカルにトラッキングしています。私のリモート ブランチは test2/test2 (origin/branch-name) で、ローカルで test2 として追跡されています。
オリジンの名前も test2 です。ローカル追跡ブランチ test2 をチェックアウトしていません。
「git pull origin remote-branch:local-tracked-branch」を実行すると、このエラーが発生します
[test2]$ git pull test2 test2:test2 /gitvobs/git_bare/test2 から ! [却下] test2 -> test2 (非早送り)
一方、ローカル トラッキング ブランチ test2 をチェックアウトして pull 'git pull origin local-tracked-branch' を実行すると、エラーは発生せず、'git pull test2 test2' を使用してプルを実行します。
/gitvobs/git_bare/test2 から * ブランチ test2 -> FETCH_HEAD a.txt の自動マージ 自動マージに失敗しました。競合を修正してから、結果をコミットします。
+ (git pull test2 +test2:test2) を追加すると役立つことはわかっていますが、ローカルの変更が上書きされます。
では、どのローカル ブランチが「git branch new-branch-name」を使用してローカルで作成されたか、または「git branch -b branch-name origin/branch-name」を使用してリモート ブランチからローカルで追跡されたかを知るにはどうすればよいでしょうか。
git - GITには邪悪な双子の問題がありますか?
ClearCaseでは、ディレクトリの2つの異なるバージョンで同じ名前の2つのファイルが見つかった場合、および要素のOIDが異なるが名前が同じである場合に、悪の双子が発生します。
GITでは、SHA1 IDは常に一意であり、同じ名前のファイルは常に異なるSHA1IDを持ちます。
邪悪な双子の概念はありませんが、2人以上の開発者が同じディレクトリに同じファイル名で異なる内容のファイルを作成する可能性があります。マージ中に、両方のファイルが完全に異なる場合、開発者は自分の変更をそのままにして、他の変更を残してコードを失う可能性があります。
ClearCaseと同様の問題がGITにあるかどうか、または各SHA1 IDが一意であるかどうかを誰かに知らせてもらえますか?GITに悪の双子の問題はありません。
git - gitのリモートリポジトリに新しいブランチを作成する
タイトルにあるように、リモートリポジトリのgitに新しいブランチを作成しようとしています。
これを行うために、私は以前に次のコマンドを使用していました。
これは通常は正常に機能し、実行できます
確認するために。
しかし今朝はこれが機能せず、次のエラーメッセージが表示されました。
私はメッセージをグーグルで検索し、さまざまなサイトをチェックしましたが、人々が思いついた唯一の説明は(私が見つけた)、マスターブランチを最初にプッシュする必要があるか、最初にコミットする必要があるものがあるということです、私はホストを試しましたさまざまなものがありますが、毎回エラーメッセージは同じです。
マスターブランチに問題なくコミットできます。
どんな助けでも大歓迎です。
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 ブランチのクリーンアップ
私は 2 台の異なるコンピューター (A と B) で作業しており、共通の git リモートをドロップボックス ディレクトリに保存しています。
master と devel の 2 つのブランチがあるとします。両方とも、対応するリモートの origin/master と origin/devel を追跡しています。
コンピューター A で、ローカルとリモートのブランチ devel を削除します。
コンピューター A で実行git branch -a
すると、次のブランチのリストが表示されます。
- 主人
- 原点/HEAD
- オリジン/マスター
git fetch
コンピューター B で実行している場合、ローカルの devel ブランチgit branch -d devel
は削除できますが、リモートの devel ブランチは削除できません。
git push origin :heads/devel
次のエラー メッセージを返します。
エラー: 修飾されていない宛先にプッシュできません: ヘッド/proxy3d
宛先 refspec は、リモートの既存の ref と一致せず、refs/ で始まっていません。また、ソース ref に基づいてプレフィックスを推測できません。
致命的: リモート エンドが予期せず電話を切りました
git branch -a
リモートブランチに origin/devel をリストします。
コンピューター B からリモート ブランチをクリーンアップするにはどうすればよいですか?
svn - git-svn ブランチ: git config の設定方法
数か月前、svn リポジトリで git を構成しました。今まで、提供されたアプリケーションを最新の状態に保つためにsvnリポジトリのみを使用していました。しかし今、私はまたコミットしたいと思っています。これを行うには、コミットするすべての機能を別のブランチに配置する必要があります。新しいブランチなどを作成する方法について読みましたが、gitの構成を間違えたと思います。ブランチ情報がありません。トランク情報しかないと思います。これは私の svn リポジトリが私の git config でどのように設定されているかです:
ご覧のとおり、私の svn-remote URL は直接トランクに移動します。これを追加することについて読みました:
しかし、新しいブランチを作成すると、トランク/ブランチ/に追加されます。行を追加しないと、ブランチの宛先がわかりません。
既存のブランチやコードなどを壊さずにこれを解決する方法はありますか?
はじめまして、ダーン
git - svnにチェックインしてはならない大量のファイルを扱うGit
私は svn の背後で git を使用しており、ブランチごとに完全なビルドを行う必要があります (数分かかります)。これらのビルド ファイルはチェックインするべきではありませんが、ユーザーが変更したファイルが混在しているため、ディレクトリを除外することはできません。ユーザーが変更したファイルも変更される可能性があります。つまり、それらのファイルだけに特別なルールを作成することはできません。
各ブランチの git でチェックインされていないファイルのセットを維持する方法はありますか? 私のオプションは何ですか?