これが私をかなり悩ませているシナリオです。
ジャックはソフトウェアハウスのfoobarで働いています。ジャックは 働くプログラマー です。彼はコーディングが大好きで、頻繁にコミットしています。ジャックのマネージャーであるポールは、新しいコードレビューツールであるphabricatorの使用を開始すると彼に言います。ジャックはそれに応じ、ジャックはローカルブランチを作成して作業を開始します。彼は機能を追加し、ローカルブランチに頻繁にコミットします。 1日の終わりに、彼はphabricatorリクエストを送信します。
arc diff development
ジャックチームのメンバーであるジョンは、コードを確認し、変更を受け入れます。ジャックはターミナルを開き、リポジトリディレクトリに移動します。ジャックは次のコマンドを入力してリビジョンを閉じ、コードを開発ブランチにマージします。
arc land --onto development
彼は次のメッセージを見ます
Landing current branch 'feature-awesome-features'.
Switched to branch development. Updating branch...
The following commit(s) will be landed:
b2ff76e Added the foo to bar
33f33ba Added a really important check which can destroy the project or save it
31a4c9a Added that new awesome feature
8cae3bf rewrote that awful code john wrote
bc54afb bug fixes
Switched to branch feature-awesome-features. Identifying and merging...
Landing revision 'D1067: Added the awesome feature'...
Rebasing feature-awesome-features onto development
Already up-to-date.
Pushing change...
ジャックはGithubを開いて、彼のコード、彼の美しいコミットを確認します。しかし、彼が見ているのは純粋な恐怖であり、彼のすべてのコミットは、基本的にこのようなことを言う単一のコミットに置き換えられています
Summary: Added the awesome feature
Test Plan: do foo bar testing
Reviewers: John
Reviewed By: John
CC: Paul
Differential Revision: http://phabricator.foobar.com/D1067
ジャックは悲しいです。彼は自分のすべてのコミットを見たいので、ジャックはこのコミットによって彼が-- The Hoarder のように見えると考えています。彼はこれを修正したいので、stackoverflowについて質問します。
That how may he prevent phabricator from eating his commit history.
代わりに、git merge
やgit Push
などのネイティブgitフローを直接使用する必要があります。 phabricatorから アークドキュメント :
変更が受け入れられたら、通常はそれらをプッシュしてリビジョンを閉じます。 arcには、これを支援するいくつかのワークフローがあります。
* squashing or merging changes from a feature branch into a master branch * formatting a good commit message with all the information from Differential * and automatically closing the revision.
これらのワークフローを使用する必要はありません。gitPush、hg Push、またはsvn commitを実行してから、Webから手動でリビジョンを閉じることができます。
arc
は意図的にコミットを押しつぶしています。
asherkinの回答は、この動作の理論的根拠と、これがデフォルトである理由を説明しています。
その引数に説得力がない場合は、--merge
フラグをarc land
に使用して、--no-ff
マージの代わりに--squash
マージを実行できます。これらのマージはローカルコミットを破壊しません。
history.immutable
で.arcconfig
をtrueに設定すると、arc land
はデフォルトで--no-ff
マージされます。
arc land
の動作が気に入らない場合は、生のgit
コマンドを使用することもできます。便宜上提供されています。
あなたの例では、5つの別々のレビューを作成することをお勧めします-実装されている複数の異なるアイデアがあり、それらは関連しておらず、簡単に分離できるようです。 レビュー可能なコードの記述 を参照してください。バグ修正、スタイルの変更、新機能を1つの変更に組み合わせると、買いだめになります。
いくつかのドキュメント があり、これがarc land
のデフォルト設定である理由を説明しています。
1つのアイデアが1つのコミットである戦略は、リポジトリが重要になる速度に達するまで、他の戦略に勝る実質的な利点はありません。特に:
- 基本的に、マスター/リモートリポジトリに対するすべての操作は、コミットではなくアイデアに関するものです。 1つのアイデアが多数のコミットである場合、どのコミットがアイデアを表すか(「fooウィジェットが壊れている、何を元に戻す必要があるか」)、または最終的にどのアイデアがコミットによって表されるかを把握する必要があるため、実行するすべてがより複雑になります。 (「commitaf3291029は意味がありません。この変更はどのような目標を達成しようとしていますか?」)。
- リリースエンジニアリングは大幅に簡素化されています。リリースエンジニアは、各アイデアが1つのコミットに対応している場合、アイデアを簡単に選択または削除できます。アイデアが複数のコミットである場合、アイデアの半分を誤って選択またはドロップして、事実上間違いが保証されている状態になってしまうことが容易になります。
- 自動テストが大幅に簡素化されます。各アイデアが1つのコミットである場合、すべてのコミットに対して自動テストを実行でき、テストの失敗は深刻な問題を示します。各アイデアが多くのコミットである場合、それらのコミットのほとんどは、コードベースの既知の壊れた状態を表します(たとえば、次のチェックポイントで修正された構文エラーのあるチェックポイント、または半分実装されたアイデア)。
- 変更の理解が大幅に簡素化されます。ログを前後に移動してアイデアの範囲を特定しなくても、二分してアイデア全体を簡単に特定できます。そして、アイデア全体を削除するために何を元に戻す必要があるかを確信できます。
- チェックポイントコミット(リポジトリの壊れたバージョンとして知られていることが保証されているものもあります)をリモートに保持することに明確な価値はありません。キーストロークごとにチェックポイントコミットを自動的に作成する理論上のVCSについて考えてみます。このVCSは明らかに使用できません。しかし、多くのチェックポイントコミットはそれほど違いはなく、概念的には、より大きなアイデアを書くための一連のキーストロークの比較的任意のポイントを表しています。それらを取り除くか、抽象化レイヤー(コミットのマージ)を作成して、アイデアの観点からリポジトリを理解しようとしているときにそれらを無視できるようにします(ほとんどの場合)。
これらはすべて、大規模にのみ問題になります。 Facebookは毎日数十のアイデアと毎週数千のアイデアをプッシュしており、1つのアイデアが1つのコミットであるリポジトリ戦略を選択せずにこれを行うことはできませんでした(少なくとも、より多くの人やエラーがないわけではありません)。
Gitの場合、推奨される解決策は、機能ブランチをアップストリームにプッシュしてから、マスターにリベースするのではなくマージすることです-上記の点に同意しても、アップストリームでチェックポイントをコミットしたい場合。
これがレビュー中のみの場合(質問の文言どおりですが、コードレビューを行っていないか、監査を使用してプッシュ後のコードレビューのみを行っているように聞こえます)、Differentialはすでにすべてのローカルコミットを元のコミットで表示していることに注意してくださいレビュー担当者が確認できるようにメッセージをコミットします。
arc land
は、リポジトリの「最終」ブランチ(つまり、リリース待ちの変更を表す本番ブランチまたは一部のブランチ)にプッシュするためにのみ使用されるように設計されています。プッシュ後のコミットレビューを行っている場合(つまり、開発からマスターへのマージ時)、arc land
(多くの場合、必要であると一般に認められています)とgit Push
をバイパスできます。直接変更します。
history.immutable:作業コピーの履歴を決して書き換えないワークフローを使用するようにarcを構成します。デフォルトでは、arcはGitの一部のワークフローで未公開の履歴の書き換え(コミットメッセージの修正、スカッシュマージ)を実行します。違いについては、以下で詳しく説明します。
.arcconfig
に行を追加するだけです
"history.immutable": true
--mergeは、マージコミットを作成するため、機能しません。私は正しいことをする--rebaseを持つように私のパッチを当てましたが、アークの人々がこれを望んでいるかどうかはわかりません。