1

クラスがあるとします。

package org.my.domain;

public class BestClassEver{}

私のワークフロー

いくつかのリファクタリングを通じて、このクラスのパッケージを変更します。

package org.another.domain;

public class BestClassEver{}

これを git を使用してローカル リポジトリにコミットし、リモート リポジトリにプッシュします。

git add .
git commit -m "Refactoring"
git push origin master

別の開発者のワークフロー

私の変更をプルせずに、別の開発者がクラスを変更します。

package org.my.domain;

public class BestClassEver{
    private String something;
}

次に、コミットしてリモート リポジトリにプッシュします。

git add .
git commit -m "Some Changes"
git push origin master

質問

  1. Git は他の開発者の変更をクラスにマージしますか?
  2. そうでない場合、どうなりますか?
  3. このワークフローは、チーム内で調整する必要があるものですか?
4

4 に答える 4

1
  1. Git は、他の開発者が自分の変更をプルせずにプッシュすることを許可しません。

両方の参照が一致しないというエラーがスローされるため、ローカル ブランチをリモート参照で更新する必要があります。

それについて知っておくべきことはほとんどすべてです。リモートリポジトリに変更がある場合、強制プッシュを行わない限り、リモートに変更がある場合、git は変更をプッシュすることを許可しません。

編集

彼がプルした後、ファイルに競合がある場合、開発者は競合を修正してコミットする必要があり、その後でのみプッシュできるようになります。

競合がなければ、git はそれらの変更を自動的にマージし、開発者はプル後にプッシュできるようになります。

もう一度編集

あなたがファイルを移動していることに気づきませんでした。いずれにせよ、実行git statusすると、プル後のローカル リポジトリの状態に関するアイデアが得られます。競合があった場合は、それらを修正できます。

ノート

On git rebaseorgit pull --rebaseは通常、プルされた他の変更の上にローカルの変更をほとんど適用するため、よりクリーンなコミット履歴を提供するために使用されます。

一方、git pullandgit mergeは通常、ブランチの変更をリンクするために追加のコミットを行います。

詳細については、このガイドをご覧くださいGit Rebasing

于 2013-02-02T16:51:44.187 に答える
0

そのようなことが失敗した場合、いくつかの回避策は次のとおりです。

  1. マージする前に、他のブランチで「リファクタリング」を繰り返すだけです。
  2. 作品をパッチに変換し(git format-patch)、パッチを編集し(その「リファクタリング」を適用し)、編集したパッチを適用します(git am)。これは手動のリベースのようなものです。

マージを複雑にするリファクタリング(たとえば、名前の変更を伴うもの)と通常のマイナーなリファクタリングを分離する方が良いと思います。

マージを複雑にするリファクトの場合、スクリプトを記述できる場合があります(などfind -name '*.c' -exec sed 's/something/anything/g' -i '{}' ';')。スクリプトは、必要なときにさまざまな場所でリファクタリングを複数回繰り返すために使用されるため、リファクタリングされたコードをリファクタリングされていないコードとマージすることは避けてください。

于 2013-02-02T17:10:54.087 に答える
0

はい。Git はこれらの変更を識別できます。私は、自分のフォーク (オリジンからフォーク) で git を使用するプロジェクトに取り組んでいます。その間、別の開発者が元のフォークのコードベースをリファクタリングしました。これには、パッケージ構造の変更が含まれます。

次のコマンドを使用しました。

  • git stash save // これにより、すべての作業が個人用スタッシュに保存されます
  • git pull // プライマリ フォークとマージのすべての最新の変更を取得します
  • git stash apply stash@{0} // または個人的な作業を保存したスタッシュ

これで、リファクタリングされたコードベースと変更ができました。競合なしでコミットできるようになり、パッケージは変更されません。

私の場合、元のフォークがリファクタリングされるのを待ってから、変更をコミットしました。これは、いくつかのファイルへの変更のみであり、再パッケージ化ではありません。

また、新しいファイルを追加した場合は、インポートが正しいことを確認するためにいくつかのインポートを編集する必要がある場合があることに注意してください。例えば。org.my.domain をインポートします。次のように編集する必要があります。 import org.another.domain;

于 2016-04-13T22:16:03.023 に答える