Closed6
gitの練習1
コードレビューでミスコミュニケーションが起こって、コードが行ったり来たりします。コミットを追加して書き足す方が望ましいのか、revertすべきか分かりませんが、とりあえず過去の履歴を改竄した場合のご紹介(当然ながらコンフリクト起こします)。
コンフリクト起こした場合、このような単純なケースでもほぼ手で書き直す感じになります。
こんなコードを書いたとして、何人かから同時にコードレビューしてもらってるとする。
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)")
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に変更"
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をジェネリック型にする"
しばらくして...
$ 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 (SumをCustomStringConvertible準拠であることを明示する)
}
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 (SumをCustomStringConvertible準拠であることを明示する)
ファイルを編集した後
$ 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)
直前のコミットの修正なら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にクローズされました