web-dev-qa-db-ja.com

パッチはGitでどのように機能しますか?

私はGitを初めて使用しますが、SVNに精通しています。テストとして、git initを使用してローカルディレクトリにリポジトリを作成しました。次に、空のリポジトリを別のローカルディレクトリに複製しました(127.0.0.1を使用してSSH経由でテストしたかったのです)。リポジトリ2にいくつかのファイルを追加し、git add *を実行し、最後にgit commit -a -m "First source code"を実行しました。

git format-patchを使用してパッチを作成し、リポジトリ1に適用したいと思います。これを行うにはどうすればよいですか?マニュアルがあることは知っていますが、これらは非常に複雑で、モニターに特定のことをしたくなります。

29
Pieter

次の方法でパッチを作成します。

$ git format-patch master --stdout > patch.diff

次に、patch.diffにdiffが含まれます。これを他の人に送信して、以下を使用して適用できます。

$ git am < patch.diff

マニュアルが少し密集している場合は、チュートリアルを探すのが理にかなっていることがあります。

http://luhman.org/blog/2009/09/22/git-patch-tutorial

21
Jon

最後のコミット(または最後の数回のコミット)からパッチを作成する最も簡単な方法は、パッチを作成するコミットの数を示す負の数でformat-patchを使用することです。

git format-patch -1

コミットの説明にちなんで名付けられたパッチファイルを取得します。 amを使用して、別のリポジトリに挿入します。

git am << name_of_patch_file
14
Jakob Borg

GitHubパッチの使用

  1. 追加 .patchパッチファイルを取得するためのコミットURL、例

    github.com/git/git/commit/b6b3b6a.patch

  2. 次のように元のファイルにパッチを適用します。

    git am /tmp/b6b3b6a.patch
    

GitHubdiffの使用

  1. 追加 .diffパッチファイルを取得するためのコミットURL、例

    github.com/git/git/commit/b6b3b6a.diff

  2. 次のように元のファイルにパッチを適用します。

    git apply -p0 /tmp/b6b3b6a.diff
    

§5.3分散Git-プロジェクトの保守

2
Steven Penny

Gitを使用している場合、これを行うための適切で簡単な方法は、リモートを使用することです。

cd \path\to\repo1
git remote add otherrepo \path\to\repo2
git fetch otherrepo

git log otherrepo/master  ## Find the commit you want to steal in the list

git cherry-pick SOME_SHA1  ## Snag just one commit
git merge otherrepo/master  ## Merge all of the new commits from otherrepo/master

これにより、作成者とコミットメッセージを含め、あるリポジトリから別のリポジトリにcommitsが移行され、マージの競合を整理するのに役立ちます(特に、1つ以上のコミットを移動する場合)

2
Ana Betts

Git 2.25(2020年第1四半期)では、 git format-patch が進化し、サブジェクトとしてブランチの説明( "git branch --edit-description")をより適切に使用できるようになりました。

commit bf8e65bcommit a92331dcommit 46273df (15 Oct 2019)を参照してくださいby Denton Liu(Denton-L
Junio C Hamano --gitster- in commit b75ba9b 、2019年11月10日)

format-patch--cover-from-descriptionオプションを教える

サインオフ:Denton Liu

以前は、format-patchがカバーレターを生成すると、本文のみにブランチの説明が入力され、件名にはプレースホルダーテキストが入力されていました。

ただし、ユーザーは、カバーレターの件名を同じ方法で自動的に入力することを希望する場合があります。

Format-patchに--cover-from-descriptionオプションと対応するformat.coverFromDescription構成を受け入れるように教え、ユーザーが今すぐ件名を含むカバーレター(のさまざまな部分を入力できるようにします)。

git configドキュメント に含まれるもの:

format.coverFromDescription:

ブランチの説明を使用してカバーレターのどの部分に入力するかを決定するためのformat-patchのデフォルトモード。

そして git format-patch

--cover-from-description=<mode>:

ブランチの説明を使用して、カバーレターのどの部分に自動的に入力されるかを制御します。

  • <mode>messageまたはdefaultの場合、カバーレターの件名にはプレースホルダーテキストが入力されます。
    カバーレターの本文には、支店の説明が入力されます。これは、構成もコマンドラインオプションも指定されていない場合のデフォルトモードです。

  • <mode>subjectの場合、ブランチの説明の最初の段落にカバーレターの件名が入力されます。
    説明の残りの部分は、カバーレターの本文に入力されます。

  • <mode>autoの場合、ブランチの説明の最初の段落が100バイトより大きい場合、モードはmessageになり、それ以外の場合はsubjectが使用されます。 。

  • <mode>noneの場合、カバーレターの件名と本文の両方にプレースホルダーテキストが入力されます。

0
VonC

パッチの作成元である「リポジトリ2」に移動し、git-format-patchを実行してパッチを作成する必要があります。gitformat-patchmaster --stdout> name_of_patch_file

次に、パッチを適用する「リポジトリ1」に移動します。gitapplyname_of_patch_file

パッチが問題を引き起こすかどうかを確認するだけで便利な場合があります:git apply --check name_of_patch_file

0
baraber