第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Git2go:如何處理簡單的合并沖突

Git2go:如何處理簡單的合并沖突

Go
幕布斯7119047 2022-01-10 10:59:10
對于一個簡單的實時編碼環(huán)境,我正在編寫一個 git add、commit 和 push 函數(shù),當(dāng)兩個用戶在文件的同一部分編碼時,除了沖突的情況外,它工作正常。它正確執(zhí)行沖突分析并加載結(jié)果:// Live-Editor, Processing / Javascriptfill(130, 52, 130);<<<<<<< HEADtextSize(130);=======textSize(120);>>>>>>> mastertext( "??",160, 100);顯示 git 風(fēng)格的差異。但是當(dāng)我在編輯器中進行更改并再次添加/提交/推送時,它會導(dǎo)致同樣的沖突。就好像它沒有“記住”沖突已經(jīng)存在并再次出現(xiàn)。(與 git 命令行行為不同。)這是我的代碼(我去掉了錯誤處理以使其更短......)// Addrepo, 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)// Commitsig := &git.Signature{    Name:  userName,    Email: userName + "@" + beego.AppConfig.String("userdata::emailserver"),    When:  time.Now(),}var currentCommit *git.Oidif 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")// Pullif 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)        }    }}// Pusherr = remote.Push([]string{"refs/heads/master"}, nil, sig, message)我猜關(guān)鍵部分是在// Check for conflicts不知何故使 git 目錄處于一種讓我們執(zhí)行相同分析的狀態(tài)之后。我考慮過在用戶進行更改并再次提交項目后不進行分析,但與此同時另一個用戶可能已經(jīng)更改了遠(yuǎn)程倉庫中的某些內(nèi)容。如何用 git2go 處理此類沖突的好方法?
查看完整描述

1 回答

?
暮色呼如

TA貢獻1853條經(jīng)驗 獲得超9個贊

我解決了這個問題。碰撞檢測工作正常。如果發(fā)生無法自動解決的沖突,則將控制權(quán)交還給用戶。他進行了更改,而這些更改在沖突分析再次發(fā)生之前并未提交。


這是完整的代碼(“合并提交(以防——現(xiàn)在希望解決——沖突)之后的部分至關(guān)重要?!保?/p>


//////////////////////////////////////////////////////////

// GitAddCommitPush

func GitAddCommitPush(userName string, dir string, message string, firstCommit bool) error {


    ///////////////////////////////////////////////////////////////////////

    // Add

    //

    // 1 Open repository

    repo, err := git.OpenRepository(dir)

    if err != nil {

        beego.Error("OpenRepository - ", err)

    }


    // 2 Retrieve index

    index, err := repo.Index()

    if err != nil {

        beego.Error("Index - ", err)

    }


    // 3 Remember if we had conflicts before we added everything to the index

    indexHadConflicts := index.HasConflicts()


    // 4 Add everything to the index

    err = index.AddAll([]string{}, git.IndexAddDefault, nil)

    if err != nil {

        beego.Error("AddAll - ", err)

    }


    // 5 Write the index (so git knows about it)

    err = index.Write()

    if err != nil {

        beego.Error("Write - ", err)

    }


    // 6 Write the current index tree to the repo

    treeId, err := index.WriteTreeTo(repo)

    if err != nil {

        beego.Error("WriteTreeTo - ", err)

    }


    /////////////////////////////////////////////////////////////////////////////////////////////

    // Commit

    //

    // 1 Retrieve the tree we just wrote (git's reference of it that it made in the last step)

    tree, err := repo.LookupTree(treeId)

    if err != nil {

        beego.Error("LookupTree - ", err)

    }


    // 2 Create a signature

    sig := &git.Signature{

        Name:  userName,

        Email: userName + "@" + beego.AppConfig.String("userdata::emailserver"),

        When:  time.Now(),

    }


    // 3 Get remote now (as we need it for both, fetch and later push )

    remote, err := repo.LookupRemote("origin")

    if err != nil {

        remote, err = repo.CreateRemote("origin", repo.Path())

        if err != nil {

            beego.Error("CreateRemote - ", err)

        }

    }


    // 4 Read the remote branch

    remoteBranch, err := repo.LookupReference("refs/remotes/origin/master")

    if err != nil {

        beego.Error("Fetch 2 - ", err)

    }


    // 5 Determine if this is a first commit ...

    if firstCommit == true {


        // 5a ... then create a new one

        _, err = repo.CreateCommit("HEAD", sig, sig, message, tree)


    } else {


        // 5b ... or retrieve current head

        currentBranch, err := repo.Head()

        if err != nil {

            beego.Error("Head - ", err)

        }


        // 6 Retrieve current commit

        currentTip, err := repo.LookupCommit(currentBranch.Target())

        if err != nil {

            beego.Error("LookupCommit - ", err)

        }


        // 7 Create a new one on top

        currentCommit, err := repo.CreateCommit("HEAD", sig, sig, message, tree, currentTip)

        if err != nil {

            beego.Error("CreateCommit - ", err)

        }


        ////////////////////////////////////////////////////////////////////////////////////

        // Merge commit (in case of -- now hopefully resolved -- conflicts)

        //

        // 1 If there were conflicts, do the merge commit

        if indexHadConflicts == true {


            // 2 Retrieve the local commit

            localCommit, err := repo.LookupCommit(currentCommit)

            if err != nil {

                beego.Error("Fetch 11 - ", err)

            }


            // 3 Retrieve the remote commit

            remoteCommit, err := repo.LookupCommit(remoteBranch.Target())

            if err != nil {

                beego.Error("Fetch 12 - ", err)

            }


            // 4 Create a new one

            repo.CreateCommit("HEAD", sig, sig, "Merge commit", tree, localCommit, remoteCommit)


            // 5 Clean up

            repo.StateCleanup()

        }


        ///////////////////////////////////////////////////////////////////////////////////

        // Pull (Fetch and Commit)

        //

        // 1 Fetch it (pull without commit)

        err = remote.Fetch([]string{}, nil, "")

        if err != nil {

            beego.Error("Fetch 1 - ", err)

        }


        // 2 Perform an annotated commit

        annotatedCommit, err := repo.AnnotatedCommitFromRef(remoteBranch)

        if err != nil {

            beego.Error("Fetch 3 - ", err)

        }


        // 3 Do the merge analysis

        mergeHeads := make([]*git.AnnotatedCommit, 1)

        mergeHeads[0] = annotatedCommit

        analysis, _, err := repo.MergeAnalysis(mergeHeads)

        if err != nil {

            beego.Error("Fetch 4 - ", err)

        }


        // 4 Check if something happend

        if analysis&git.MergeAnalysisUpToDate == 0 && analysis&git.MergeAnalysisNormal != 0 {


            // 5 Yes! First just merge changes

            if err := repo.Merge([]*git.AnnotatedCommit{annotatedCommit}, nil, nil); err != nil {

                beego.Error("Fetch 5 - ", err)

            }


            // 6 Retrieve the index after that treatment

            index, err := repo.Index()

            if err != nil {

                beego.Error("Fetch 6 - ", err)

            }


            // 7 Check for conflicts

            if index.HasConflicts() {


                // 7a There are not automaticly solvable conflicts ... give them back to the user

                beego.Trace("Conflicts! Write new index and return.", index)

                err = index.Write()

                if err != nil {

                    beego.Error("Write - ", err)

                }


                return errors.New("Conflicts")

            }


            // 8 Write the new tree

            treeId, err := index.WriteTree()

            if err != nil {

                beego.Error("Fetch 9 - ", err)

            }


            // 9 Retrieve the new tree

            tree, err := repo.LookupTree(treeId)

            if err != nil {

                beego.Error("Fetch 10 - ", err)

            }


            // 10 Retrieve the local commit

            localCommit, err := repo.LookupCommit(currentCommit)

            if err != nil {

                beego.Error("Fetch 11 - ", err)

            }


            // 11 Retrieve the remote commit

            remoteCommit, err := repo.LookupCommit(remoteBranch.Target())

            if err != nil {

                beego.Error("Fetch 12 - ", err)

            }


            // 12 Create a new one

            repo.CreateCommit("HEAD", sig, sig, "Merge commit", tree, localCommit, remoteCommit)


            // 13 Clean up

            repo.StateCleanup()

        }

    }


    //////////////////////////////////////////////////////////////////////////////////////////////////////

    // Push

    err = remote.Push([]string{"refs/heads/master"}, nil, sig, message)

    if err != nil {

        beego.Error("Push - ", err)

    }


    return err

}



查看完整回答
反對 回復(fù) 2022-01-10
  • 1 回答
  • 0 關(guān)注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號