Closed6

gitの練習1

nabeyangnabeyang

コードレビューでミスコミュニケーションが起こって、コードが行ったり来たりします。コミットを追加して書き足す方が望ましいのか、revertすべきか分かりませんが、とりあえず過去の履歴を改竄した場合のご紹介(当然ながらコンフリクト起こします)。

コンフリクト起こした場合、このような単純なケースでもほぼ手で書き直す感じになります。

nabeyangnabeyang

こんなコードを書いたとして、何人かから同時にコードレビューしてもらってるとする。

Sum.swift
class Sum {
    let left: Int
    let right: Int
    init(_ left: Int, _ right: Int) {
        self.left = left
        self.right = right
    }
    var value: Int { return left + right }
    var description: String {
        return "\(left) + \(right)"
    }
}
main.swift
let sum: Sum = .init(4, 5)
print("\(sum.description) = \(sum.value)")
nabeyangnabeyang
Sum.swift
 class Sum {
-    let left: Int
-    let right: Int
-    init(_ left: Int, _ right: Int) {
-        self.left = left
-        self.right = right
+    private let args: (Int, Int)
+    init(_ args: (Int, Int)) {
+        self.args = args
     }
-    var value: Int { return left + right }
+    var value: Int { return args.0 + args.1 }
     var description: String {
-        return "\(left) + \(right)"
+        return "\(args.0) + \(args.1)"
     }
 }
main.swift
-let sum: Sum = .init(4, 5)
+let sum: Sum = .init((4, 5))
 print("\(sum.description) = \(sum.value)")
git commit -m "プロパティをprivateに変更"
nabeyangnabeyang
Sum.swift
-class Sum {
+class Sum: CustomStringConvertible {
     private let args: (Int, Int)
     init(_ args: (Int, Int)) {
         self.args = args
main.swift
 let sum: Sum = .init((4, 5))
-print("\(sum.description) = \(sum.value)")
+print("\(sum) = \(sum.value)")
git commit -m "SumをCustomStringConvertible準拠であることを明示する"
Sum.swift
-class Sum: CustomStringConvertible {
-    private let args: (Int, Int)
-    init(_ args: (Int, Int)) {
+class Sum<N: Numeric>: CustomStringConvertible {
+    private let args: (N, N)
+    init(_ args: (N, N)) {
         self.args = args
     }
-    var value: Int { return args.0 + args.1 }
+    var value: N { return args.0 + args.1 }
     var description: String {
         return "\(args.0) + \(args.1)"
     }
main.swift
-let sum: Sum = .init((4, 5))
+let sum: Sum<Int> = .init((4, 5))
 print("\(sum) = \(sum.value)")
git commit -m "Sumをジェネリック型にする"
nabeyangnabeyang

しばらくして...

$ git rebase -i HEAD~3
e 7d55af0 プロパティをprivateに変更
pick a8c2f88 SumをCustomStringConvertible準拠であることを明示する
pick 4ab5a08 Sumをジェネリック型にする
$ git reset HEAD~
$ git checkout .
Sum.swift
 class Sum {
-    let left: Int
-    let right: Int
+    private let left: Int
+    private let right: Int
     init(_ left: Int, _ right: Int) {
         self.left = left
         self.right = right
$ git add /path/to/Sum.swift
$ git commit -m "プロパティをprivateに変更"
$ git rebase --continue
Auto-merging Sources/Tmp/main.swift
CONFLICT (content): Merge conflict in Sources/Tmp/main.swift
Auto-merging Sources/Tmp/Sum.swift
CONFLICT (content): Merge conflict in Sources/Tmp/Sum.swift
error: could not apply a8c2f88... SumをCustomStringConvertible準拠であることを明示する
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply a8c2f88... SumをCustomStringConvertible準拠であることを明示する
Sum.swift
<<<<<<< HEAD
class Sum {
    private let left: Int
    private let right: Int
    init(_ left: Int, _ right: Int) {
        self.left = left
        self.right = right
=======
class Sum: CustomStringConvertible {
    private let args: (Int, Int)
    init(_ args: (Int, Int)) {
        self.args = args
>>>>>>> a8c2f88 (SumCustomStringConvertible準拠であることを明示する)
    }
    var value: Int { return left + right }
    var description: String {
        return "\(left) + \(right)"
    }
}
main.swift
<<<<<<< HEAD
let sum: Sum = .init(4, 5)
print("\(sum.description) = \(sum.value)")
=======
let sum: Sum = .init((4, 5))
print("\(sum) = \(sum.value)")
>>>>>>> a8c2f88 (SumCustomStringConvertible準拠であることを明示する)

ファイルを編集した後

$ git add Sources/Tmp/Sum.swift
$ git add Sources/Tmp/main.swift
$ git rebase --continue # エディタが開く。そのまま保存
[detached HEAD dda5351] SumをCustomStringConvertible準拠であることを明示する
 2 files changed, 2 insertions(+), 2 deletions(-)
Auto-merging Sources/Tmp/main.swift
CONFLICT (content): Merge conflict in Sources/Tmp/main.swift
Auto-merging Sources/Tmp/Sum.swift
CONFLICT (content): Merge conflict in Sources/Tmp/Sum.swift
error: could not apply 4ab5a08... Sumをジェネリック型にする
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 4ab5a08... Sumをジェネリック型にする

先ほどと同様にコンフリクトしてるので、編集します。

$ git add Sources/Tmp/Sum.swift
$ git add Sources/Tmp/main.swift
$ git rebase --continue # エディタが開く。そのまま保存
[detached HEAD f4b0f5c] Sumをジェネリック型にする
 2 files changed, 6 insertions(+), 6 deletions(-)
Successfully rebased and updated refs/heads/main.

解決しました。

Sum.swift
-class Sum: CustomStringConvertible {
-    private let left: Int
-    private let right: Int
-    init(_ left: Int, _ right: Int) {
+class Sum<N: Numeric>: CustomStringConvertible {
+    private let left: N
+    private let right: N
+    init(_ left: N, _ right: N) {
         self.left = left
         self.right = right
     }
-    var value: Int { return left + right }
+    var value: N { return left + right }
     var description: String {
         return "\(left) + \(right)"
     }
main.swift
-let sum: Sum = .init(4, 5)
+let sum: Sum<Int> = .init(4, 5)
nabeyangnabeyang

直前のコミットの修正ならrebaseしなくて良いです。

$ git reset HEAD^ 

ファイルを編集

Sum.swift
-class Sum: CustomStringConvertible {
-    private let left: Int
-    private let right: Int
-    init(_ left: Int, _ right: Int) {
+class Sum<A: AdditiveArithmetic>: CustomStringConvertible {
+    private let left: A
+    private let right: A
+    init(_ left: A, _ right: A) {
         self.left = left
         self.right = right
     }
-    var value: Int { return left + right }
+    var value: A { return left + right }
     var description: String {
         return "\(left) + \(right)"
     }
$ git add .
git commit -m "Sumをジェネリック型にする"
このスクラップは2022/04/29にクローズされました