naoki86star

インターネットの片隅でなにかしら書いてみる

備忘:git reset

cloneと、そこからさらにcloneしたディレクトリそれぞれで作業していたときのことです。(それぞれを子・孫と表現する)
基本的には子で作業していて、子・孫での作業対象は競合させてません。

孫で作業してgit pushしたときに、子側のディレクトリそのファイルを反映させるときgit checkoutでは足らず、その前にgit resetが必要だったという話です。

孫でgit pushしたときに、repogitoryにはそのファイルの更新分が格納されます。子のディレクトリにはたいていの場合その時点で孫の編集前のファイルが存在しますが、これが孫のpush時点でcommit待ち扱いになります。

これに気づかずに、子側での作業で別ファイルのcommitをpushしたときに、結果的に孫のファイルをrevertしてしまうような羽目に一度あいました。

孫でpushしたファイルは子側でgit resetして改めてgit checkoutすることで子のディレクトリに反映されリポジトリとも同期状態になります。


そもそもcloneのcloneというような曲芸状態をやっているのもアレですけども、今の自分の作業環境だとそれがベターな解でそういうことしてます。最初はsvnとか使ってたのですけど、svnはcheckoutしたもの自体をrepositoryに見立てるのができなかったと思っていて、手動でコピーとかしてました。gitはcloneのcloneができて自分の作業だと対象ファイルの競合まではなかったのでなんとかなるかなぁと思っていてうまくいっていたと思ったのが一度ファイルを吹き飛ばした(ように見えてちゃんとrepogitory上は履歴で残っている)のであれれと思って悩んでいた次第です。