これは直感に反するように聞こえますが、私に聞いてください:
gitの実験を開始するように奨励します
gitの興味深い点の1つは、ローカル操作を完全に安全にすることが驚くほど簡単であることです。私が最初にgitを使い始めたとき、自分がやっていることの1つは、何かを間違えた場合に備えて、ディレクトリ全体をバックアップとして圧縮することでした。私はこの後が膨大その場しのぎで、実際にあなたの仕事を保護するために必要なることはほとんどありませんことを発見し、それがあることの美徳がある非常に安全で、非常にシンプルに、あなたがやっている一体で何を知らなくても、どのように試してみたいコマンドが判明します。これをしているときに避けなければならない唯一のことはpush
。何もプッシュしない場合、これはあなたが望むものを試すための100%安全な方法です。
ものを試すことへの恐怖は、gitを学ぶ上で最大の障害の1つです。それはあなたに与えますので、それは困難なのようなものだすべてのものの上に多くの制御を。現実には、毎日の使用のほとんどでいくつかの非常に安全な操作に固執することができますが、それらのコマンドを見つけるには多少の探索が必要です。
彼らに安全感を与えることにより、彼らは自分で物事を行う方法を見つけようとするはるかに喜んでいるでしょう。そして、彼らは彼らのために働くローカルマシン上で個人的なワークフローを見つけるためにはるかに力を与えられます。そして、誰もがローカルで同じことをしていなければ、彼らがプッシュするもので標準を順守している限り、それは問題ありません。操作を行う前にレポ全体を圧縮して、そのように感じさせる場合は、問題ありません。彼らは、物事を行うときや物事を試みるときに、物事を行うより良い方法を手に入れることができます。何かを試して、それが何をするのかを見始めるためにあなた自身を得るための何か。
これは、トレーニングに価値がないという意味ではありません。それどころか、トレーニングは機能やパターン、規範を紹介するのに役立ちます。しかし、それは座って、実際に代わるものではありませんやって、あなたの毎日の仕事で何かを。gitとSVNのどちらも、クラスに移動するだけで、すべてのことを知っているわけではありません。それらを使用して問題を解決し、問題に精通し、どの機能がどの問題に適しているかを知る必要があります。
gitの内と外を学ぶことをやめさせないでください
私は何もプッシュしないことに言及しましたが、それは実際にあなたが教えてきたものの1つに反します:常に「コミットしてプッシュする」ことです。私はあなたに彼らにこれをするように言うのをやめ、反対のことを始めるように言うべきだと信じています。Gitには、基本的に変更が可能な5つの「場所」があります。
- ディスク上で、コミットされていません
- ステージングされたがコミットされていない
- でローカルコミット
- 地元の隠れ家で
- リモートリポジトリ(コミットとタグのみが異なるリポジトリ間でプッシュおよびプルされる)
単一のステップですべてを引き出してプッシュするように促すのではなく、これらの5つの異なる場所を活用するように奨励します。以下を奨励します。
これにより、すべての人に公開される前に作業を確認するようになります。つまり、間違いをより早く見つけることができます。彼らはコミットを見て、「待って、それは私が望んでいたものではない」と考え、SVNとは異なり、プッシュする前に戻ってやり直すことができます。
変更がどこにあるかを理解するという考えに慣れたら、ステップをスキップして特定の操作を組み合わせるタイミングの決定を開始できます(フェッチ+マージが必要であることが既にわかっているためプルするタイミング、またはそのコミット&プッシュオプションをクリックするタイミング) 。
これは実際、SVNに対するgitの大きな利点の1つであり、gitはこの使用パターンを念頭に置いて設計されています。対照的に、SVNは中央リポジトリを想定しているため、gitのツールが同じワークフロー用に最適化されていなくても当然です。SVNでは、コミットが間違っている場合、唯一の本当の手段は、ミスを取り消す新しいコミットです。
これを実行すると、実際には次の戦略に自然につながります。
地元の支店を使用するように奨励する
ローカルブランチは、実際に共有ファイルで作業する際の多くの問題を緩和します。私は自分のブランチで必要なすべての変更を行うことができますが、プッシュしていないので、誰にも影響しません。時間が来たら、同じマージとリベースの戦略をすべて使用できますが、より簡単です:
- ローカルブランチをリベースすることができます。これにより、ブランチをマージするのが簡単になります。
- masterでプレーンマージ(新しいコミットの作成)を使用して、ローカルブランチの変更をそこに取り込むことができます。
- 私のブランチが救い出すには面倒すぎると思うなら、ローカルブランチ全体をマスター上の単一のコミットにスカッシュマージできます。
ローカルブランチを使用することは、体系的なブランチ戦略を理解するための良い出発点でもあります。ユーザーが自分の分岐のニーズをよりよく理解するのに役立ちます。そのため、誰もが聞いたことがあるためにGitflowをドロップするだけでなく、ニーズとチームの現在の理解/スキルレベルに基づいて戦略を選択できます。
概要
要するに、gitはSVNではなく、そのように扱うことはできません。必要がある:
- 安全な実験を奨励することにより、恐怖を排除します。
- gitがどのように異なるかを理解してもらい、通常のワークフローがどのように変化するかを確認してください。
- 問題をより簡単に解決できるよう、利用可能な機能を理解してもらいます。
これにより、一連の標準の実装を開始できるようになるまで、より良いgitの使用を徐々に取り入れることができます。
特定の機能
短期的には、次のアイデアが役立つ場合があります。
リベース
あなたはリベースについて言及しましたが、あなたは質問でそれを本当に理解していないと言いました。だからここに私のアドバイスがあります:私が今説明したことを試してみてください。誰かがいくつかの変更をプッシュしている間に、いくつかの変更をローカルで行います。ローカルで変更をコミットします。リポジトリディレクトリをバックアップとして圧縮します。他の人の変更を取得します。リベースコマンドを実行して、コミットがどうなるか見てみましょう!無限のブログ投稿を読んだり、リベースとその使用方法または使用方法に関するトレーニングを受けたりすることができますが、実際の動作を確認するための代替手段はありません。だから、してみてくださいそれを。
merge.ff=only
これは個人的な好みの問題になりますが、競合の処理にすでに問題があると述べたので、少なくとも一時的にはお勧めします。私がお勧めの設定merge.ff
にonly
:
git config --global merge.ff only
「ff」は「早送り」の略です。早送りマージとは、gitが異なるコミットからの変更を結合する必要がない場合です。グラフの直線に沿って、ブランチのポインタを新しいコミットに移動するだけです。
これが実際に行うことは、gitが自動的にマージコミットを作成しようとするのを防ぐことです。したがって、ローカルで何かをコミットしてから、他の誰かの変更をプルすると、マージコミットを作成するのではなく(潜在的にユーザーに競合を処理させる)、マージは失敗します。実際、gitはaのみを実行しfetch
ます。ローカルコミットがない場合、マージは正常に進行します。
これにより、ユーザーはさまざまなコミットを確認してから、それらのマージを試行し、それらの組み合わせを最適に処理する方法を決定することができます。リベースするか、マージを続行する(git merge --no-ff
構成をバイパスするために使用する)か、変更のマージを今のところ先送りして後で処理することもできます。この小さなスピードバンプは、チームがマージに関して誤った決定を下すのを防ぐのに役立つと思います。マージの処理が改善されたら、チームにオフにすることができます。