web-dev-qa-db-ja.com

phabricatorが私のコミット履歴を食べないようにする方法

これが私をかなり悩ませているシナリオです。

ジャックはソフトウェアハウスの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.
33
xeon111

代わりに、git mergegit 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は意図的にコミットを押しつぶしています。

9
mockinterface

asherkinの回答は、この動作の理論的根拠と、これがデフォルトである理由を説明しています。

その引数に説得力がない場合は、--mergeフラグをarc landに使用して、--no-ffマージの代わりに--squashマージを実行できます。これらのマージはローカルコミットを破壊しません。

history.immutable.arcconfigをtrueに設定すると、arc landはデフォルトで--no-ffマージされます。

arc landの動作が気に入らない場合は、生のgitコマンドを使用することもできます。便宜上提供されています。

あなたの例では、5つの別々のレビューを作成することをお勧めします-実装されている複数の異なるアイデアがあり、それらは関連しておらず、簡単に分離できるようです。 レビュー可能なコードの記述 を参照してください。バグ修正、スタイルの変更、新機能を1つの変更に組み合わせると、買いだめになります。

19
Evan Priestley

いくつかのドキュメント があり、これがarc landのデフォルト設定である理由を説明しています。

1つのアイデアが1つのコミットである戦略は、リポジトリが重要になる速度に達するまで、他の戦略に勝る実質的な利点はありません。特に:

  • 基本的に、マスター/リモートリポジトリに対するすべての操作は、コミットではなくアイデアに関するものです。 1つのアイデアが多数のコミットである場合、どのコミットがアイデアを表すか(「fooウィジェットが壊れている、何を元に戻す必要があるか」)、または最終的にどのアイデアがコミットによって表されるかを把握する必要があるため、実行するすべてがより複雑になります。 (「commitaf3291029は意味がありません。この変更はどのような目標を達成しようとしていますか?」)。
  • リリースエンジニアリングは大幅に簡素化されています。リリースエンジニアは、各アイデアが1つのコミットに対応している場合、アイデアを簡単に選択または削除できます。アイデアが複数のコミットである場合、アイデアの半分を誤って選択またはドロップして、事実上間違いが保証されている状態になってしまうことが容易になります。
  • 自動テストが大幅に簡素化されます。各アイデアが1つのコミットである場合、すべてのコミットに対して自動テストを実行でき、テストの失敗は深刻な問題を示します。各アイデアが多くのコミットである場合、それらのコミットのほとんどは、コードベースの既知の壊れた状態を表します(たとえば、次のチェックポイントで修正された構文エラーのあるチェックポイント、または半分実装されたアイデア)。
  • 変更の理解が大幅に簡素化されます。ログを前後に移動してアイデアの範囲を特定しなくても、二分してアイデア全体を簡単に特定できます。そして、アイデア全体を削除するために何を元に戻す必要があるかを確信できます。
  • チェックポイントコミット(リポジトリの壊れたバージョンとして知られていることが保証されているものもあります)をリモートに保持することに明確な価値はありません。キーストロークごとにチェックポイントコミットを自動的に作成する理論上のVCSについて考えてみます。このVCSは明らかに使用できません。しかし、多くのチェックポイントコミットはそれほど違いはなく、概念的には、より大きなアイデアを書くための一連のキーストロークの比較的任意のポイントを表しています。それらを取り除くか、抽象化レイヤー(コミットのマージ)を作成して、アイデアの観点からリポジトリを理解しようとしているときにそれらを無視できるようにします(ほとんどの場合)。

これらはすべて、大規模にのみ問題になります。 Facebookは毎日数十のアイデアと毎週数千のアイデアをプッシュしており、1つのアイデアが1つのコミットであるリポジトリ戦略を選択せず​​にこれを行うことはできませんでした(少なくとも、より多くの人やエラーがないわけではありません)。

Gitの場合、推奨される解決策は、機能ブランチをアップストリームにプッシュしてから、マスターにリベースするのではなくマージすることです-上記の点に同意しても、アップストリームでチェックポイントをコミットしたい場合。

これがレビュー中のみの場合(質問の文言どおりですが、コードレビューを行っていないか、監査を使用してプッシュ後のコードレビューのみを行っているように聞こえます)、Differentialはすでにすべてのローカルコミットを元のコミットで表示していることに注意してくださいレビュー担当者が確認できるようにメッセージをコミットします。

arc landは、リポジトリの「最終」ブランチ(つまり、リリース待ちの変更を表す本番ブランチまたは一部のブランチ)にプッシュするためにのみ使用されるように設計されています。プッシュ後のコミ​​ットレビューを行っている場合(つまり、開発からマスターへのマージ時)、arc land(多くの場合、必要であると一般に認められています)とgit Pushをバイパスできます。直接変更します。

3
asherkin

history.immutable:作業コピーの履歴を決して書き換えないワークフローを使用するようにarcを構成します。デフォルトでは、arcはGitの一部のワークフローで未公開の履歴の書き換え(コミットメッセージの修正、スカッシュマージ)を実行します。違いについては、以下で詳しく説明します。

.arcconfigに行を追加するだけです

"history.immutable": true
3
Vyachesla D.

--mergeは、マージコミットを作成するため、機能しません。私は正しいことをする--rebaseを持つように私のパッチを当てましたが、アークの人々がこれを望んでいるかどうかはわかりません。

0
Tomaz Canabrava