シンプルなライブコーディング環境では、git add、commit、push関数を書いていますが、2人のユーザーが同じ部分をコーディングしている場合ファイルの競合分析を正しく実行し、結果をロードします。Git2go:単純なマージの競合の処理方法
// Live-Editor, Processing/Javascript
fill(130, 52, 130);
<<<<<<< HEAD
textSize(130);
=======
textSize(120);
>>>>>>> master
text("",160, 100);
gitスタイルの違いを示します。しかし、私がエディタで変更を行い、再度コミット/プッシュを追加すると、同じ矛盾が生じます。それは紛争がすでにそこにあったことを覚えておらず、再びそれを提示するようなものです。 (とは異なりgitのコマンドラインの動作。)ここで
は、私は// Check for conflicts
はどういうわけかそれが去った後、クリティカルセクションがあると思います私のコード(私はそれを短くするために出てエラー処理をした...)
// Add
repo, err := git.OpenRepository(dir)
index, err := repo.Index()
err = index.AddAll([]string{}, git.IndexAddDefault, nil)
err = index.Write()
treeId, err := index.WriteTreeTo(repo)
tree, err := repo.LookupTree(treeId)
// Commit
sig := &git.Signature{
Name: userName,
Email: userName + "@" + beego.AppConfig.String("userdata::emailserver"),
When: time.Now(),
}
var currentCommit *git.Oid
if firstCommit == true {
_, err = repo.CreateCommit("HEAD", sig, sig, message, tree)
} else {
currentBranch, err := repo.Head()
currentTip, err := repo.LookupCommit(currentBranch.Target())
currentCommit, err = repo.CreateCommit("HEAD", sig, sig, message, tree, currentTip)
}
remote, err := repo.LookupRemote("origin")
// Pull
if firstCommit == false {
// Pull possible changes from remote repo
err = remote.Fetch([]string{}, nil, "")
remoteBranch, err := repo.LookupReference("refs/remotes/origin/master")
annotatedCommit, err := repo.AnnotatedCommitFromRef(remoteBranch)
// Do the merge analysis
mergeHeads := make([]*git.AnnotatedCommit, 1)
mergeHeads[0] = annotatedCommit
analysis, _, err := repo.MergeAnalysis(mergeHeads)
if analysis&git.MergeAnalysisUpToDate == 0 && analysis&git.MergeAnalysisNormal != 0 {
err := repo.Merge([]*git.AnnotatedCommit{annotatedCommit}, nil, nil)
// Check for conflicts
index, err := repo.Index()
if index.HasConflicts() {
err = index.Write()
return errors.New("Conflicts")
}
// No unsolvable conflicts, commit it
treeId, err := index.WriteTree()
tree, err := repo.LookupTree(treeId)
localCommit, err := repo.LookupCommit(currentCommit)
remoteCommit, err := repo.LookupCommit(remoteBranch.Target())
repo.CreateCommit("HEAD", sig, sig, "Merge commit", tree, localCommit, remoteCommit)
repo.StateCleanup()
}
}
// Push
err = remote.Push([]string{"refs/heads/master"}, nil, sig, message)
ですgitディレクトリを同じ解析を実行できる状態にします。私は、ユーザーが変更を加えてプロジェクトを再コミットした後で分析をしないと考えましたが、その間に別のユーザーが既にリモートリポジトリ内の何かを変更している可能性があります。
git2goとのこのような競合をうまく処理するにはどうすればよいですか?
:ここ
は、完全なコード(「 - - 今、うまくいけば解決コンフリクト)重大である場合には(コミットマージ」の後のセクション)であります紛争が起きたときに、あなたが尋ねているように思えます。 HEADとリモートブランチは変更されていないので、あなたがマージしているという理由だけで分析は変更されませんが、現在行っているマージについては何も教えてくれません。 –はい、コンフリクトを検出してエディタに戻り、変更を加えてプロジェクトを再度保存するように指示するまで、最初のループですべてを正しく実行しているようです。その後、ユーザーがプロジェクトを保存するときに、私は同じ関数を呼び出して同じ結果を得ます。私はこの機能でどのように検出するか、索引が異なる状態にあること、一緒に集められない異なる経路があることは分かりません。あなたはヒントを持っています、私はこれについてどのように知ることができますか? – Michael
分析は現在の操作とは関係ありません。現在の操作をチェックして、マージしているかどうかを確認し、インデックスに競合がないかどうかを確認して、コミットを避けることができます。競合がなければ、あなたはそれをツリーとして書くことができ、他の時間と同じように、そのツリーでコミットを作成することができます。 –