2

私は git を勉強していますが、いくつかのコマンドの問題で混乱しています:

  1. 2 つのブランチ A と B を作成しました。私のローカル リポジトリには、A が既に存在していました。そして今、B を同じローカル リポジトリにチェックアウトし、A を邪魔することなく B で操作したいと考えています。では、git -stash A なしで B をチェックアウトできますか? (ついさっき、git -stash A を使わずに checkout B を直接入力しましたが、それも機能すると思います。なぜですか?) git -stash の機能は何ですか?

  2. 私は git -merge と git -rebase と混同しています。どのシチュエーションでどれを選べばいい?

4

3 に答える 3

4

Stash は、コミットされていない変更を隠しておくだけなので、しばらく他の作業を行うことができます。昔は、変更をコミットし、ブランチを切り替え、元に戻し、「git reset HEAD^」を使用してコミットを元に戻していました。

リベースに関しては、ここに私のメモがあります:

マージに似ていますが、継続性の単一のスレッドを保持します。

簡単に言えば、rebase は現在のブランチを取得し、その履歴を検索して、指定されたブランチから分岐したポイントを探します。次に、これらすべてのコミットをパッチとして取得し、指定されたブランチに適用して、それらのコミットを指定されたブランチの最後に効果的に移植します。

前:

     E--F--G        mybranch
    /
A--B--C--D          upstream

「上流のリベース」の後:

           E'-F'-G' mybranch
          /
A--B--C--D          upstream

両方のブランチにコミットがある場合 (たとえば、誰かにパッチをメールして適用した場合など)、重複して適用されることはありません。マニュアルページを参照してください。

注:これは、ブランチのコピーを既に持っている人を台無しにする可能性があります。このコマンドは、まだ別のリポジトリにプッシュされていないコミットでのみ使用するのが最適です。

アップストリームは、ブランチまたはその他の有効なコミットである可能性があります。

競合が発生した場合、git は影響を受けるファイルに競合マーカー (<<<<<) を追加し、リベースを停止します。競合を解決したら、「git add file」を使用します。すべての競合が処理されたら、「git rebase --continue」を使用します。「git rebase --abort」でリベースをキャンセルすることもできます

現在のブランチにコミットされていない変更がある場合は、リベースを行う前にまずそれらを隠しておく必要があります。


また、「-i」オプションを使用して現在のブランチの履歴を書き直すこともできます (「コミットの再配置」を参照)。

前:

A--B--C--D--E

後:

A--B--E'-C'-D'

または、コミットを結合 (スカッシュ) することもできます:

A--B--CE'-D'

または、チェーンからコミットを完全に削除します。

A--B--D'-E'

に:

この--onto branchオプションを使用すると、変更を別のブランチに完全に移植できます。たとえば、ブランチがブランチ 'foo' からフォークされたとします。

o--o--o--o--o  master
    \
     o--o--o--o--o  foo
                  \
                   o--o--o  mybranch

しかし、今は master から fork したい:

o--o--o--o--o  master
    \        \
     \        o--o--o  mybranch
      \
       o--o--o--o--o  foo

mybranch をチェックアウトして、次のコマンドを実行します。

git rebase --onto master foo

英語では、これは「foo 以降のすべての変更 (ただし、foo を含まない) を取得し、それらを master に適用する」という意味です。

--onto を使用して、チェーンからコミットを切り離すこともできます。マニュアルページを参照してください。-i もこれに使用できます。


注: rebase は有害と見なされます: このコマンドは、履歴を効果的に書き換えることによって機能します。過去のある時点からリポジトリの状態を再構築することが不可能な状態になる可能性があります。たとえば、上記の最初の例では、リポジトリの状態 E、F、および G が永久に失われます。

幸いなことに、リベースを実行する前にブランチ名またはタグを何かに割り当てておけば、何も失われることはありません。リベースを行う前に行っていればgit branch foo、ブランチ「foo」はリポジトリの元の状態 G を指し、後で復元可能になります (ブランチ foo を削除するまで)。

       E-F-G   foo
      /
     /     E'-F'-G' mybranch
    /     /
A--B--C--D          upstream
于 2013-05-16T06:31:24.257 に答える
2

git stashコミットされていない変更を保存します。たとえば、ブランチ A で機能の作業を開始し、ブランチ B で作業する必要があることに気付いた場合は、そうします。

git stash
git checkout B
git stash pop

にそれについての章があります。

リベース/マージはほとんど意見の問題です。私はしばしばリベースを好みます。リベースは履歴を書き換えるため、経験則として、すでに公開されているものはリベースしないでください。

于 2013-05-16T06:21:12.140 に答える
2

英語で「stash」は「どこかに保管する」または「将来の使用のために片付ける、または安全に保管する」という意味です。それがまさにそれgit stashです。何かに取り組んでいるが、完全には完了していないためコミットしたくないが、他の緊急の作業が必要な場合は、git stash. 最近の変更を隠して、作業が必要な新しい緊急のものに分岐します。stash の意味に関する詳細な説明については、ProGit book のこの章 (6.3 Git Tools - Stashing) を参照してください。

簡単に言えば、リベースとは自分の仕事の歴史を整理する行為を指します。その意味を完全に理解するには、分岐とは何か、マージとは何かを理解する必要があります。そのため、ProGit book の分岐に関する章を読むことをお勧めします。

于 2013-05-16T06:45:48.057 に答える