使用 libgit2sharp 检查远程分支

Checking out remote branch using libgit2sharp

考虑以下因素,我在 github 上有两个分支:master 和 dev。我有一个本地存储库,它是远程主机的克隆并指向远程主机,但我想将它切换到开发分支,以便我所做的任何更改都将提交给开发而不是主机。需要哪些步骤才能做到这一点?我尝试了多种方法,但它们似乎从来没有奏效,而且它总是致力于掌握。请简单地解释一下,因为我还是 Git 和 libgit2sharp 的新手,所以我仍在努力思考它。

编辑:我正在使用 libgit2sharp 库发出 git 命令,而不是 Git shell

如果你的开发分支存在则:

git checkout dev

如果您的开发分支尚不存在,那么您需要创建它然后切换到它:

git checkout -b dev

使用 libgit2sharp,无法执行 git checkout -b(据我所知),因此您需要使用 CreateBranch 创建分支,然后 Checkout 执行分支结帐。

代码如下所示:

private void GetOrCreateThenCheckoutBranch(string myPath, string branchName)
{
    // NOTE: This code is for demo purposes only.  It is a bad idea
    // to create code that couples multiple functions/actions together

    using (var repo = new Repository("path/to/your/repo"))
    {
        var devBranch = repo.Branches["dev"];

        if (branch == null)
        {
            // Repository returns null object when branch does not exist
            // so, create a new, LOCAL branch
            repo.CreateBranch("dev");   // Or repo.Branches.Add("dev", "HEAD");
            devBranch = repo.Branches["dev"];

            // You will need more code _here_ if you want to synchronize/set 
            // an upstream branch...
        }

        // Now, checkout the branch
        Branch currentBranch = Commands.Checkout(repo , devBranch);

        // Do more stuff...
}

Git是分布式版本控制系统。当您进行更改时,您是在本地存储库副本中的分支中进行更改。在本地进行更改后,您将需要

  • 在本地添加并提交更改(可能将它们推送到 远程存储库,如果您有同名的映射远程分支)
  • 将更改合并回 master
  • 将更改推送到远程主存储库(通常 origin/master)。

如果远程分支不允许任何人进行合并,您将需要发出 pull request

如果您还没有名为 dev 的本地分支,但是您的远程 确实 有一个 dev 分支,那么 运行 git checkout dev会在本地新建一个dev分支,设置远程跟踪信息,然后切换到新建的分支。您可以在 LibGit2Sharp 中模拟此行为。

要创建跟踪远程 dev 分支 (refs/remotes/origin/dev) 的本地分支 dev,首先找到远程分支:

Branch trackedBranch = repo.Branches["origin/dev"];

然后创建一个名为 dev 的新本地分支,它指向与 origin/dev 分支相同的提交:

Branch localBranch = repo.CreateBranch("dev", trackedBranch.Tip);

然后设置本地和远程分支之间的跟踪:

repo.Branches.Update(localBranch, b => b.UpstreamBranch = "refs/heads/dev");

最后,切换到新分支:

LibGit2Sharp.Commands.Checkout(repo, "dev");