用于由本地分支更新远程跟踪分支的用法

时间:2016-05-16 16:15:51

标签: git branch git-remote remote-branch

我知道可以按mPlayer.start(); 当前存储库的内容创建,更新或删除mPlayer.stop(); 。例如:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Vibrator vibrator = (Vibrator) MainActivity.this.getSystemService(Context.VIBRATOR_SERVICE);
        MediaPlayer mPlayer = MediaPlayer.create(context, R.raw.aaanicholas);
        Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE);
        final CheckBox vibrateBoxStrong = (CheckBox) findViewById(R.id.checkPowerStrong);


        vibrateBoxStrong.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                    MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.fansound1);
                    if(vibrateBoxStrong.isChecked()) {
                        v.vibrate(1000);            // it will vibrate for 1000 milliseconds
                        mPlayer.start();         
                    } else {
                        mPlayer.stop();

                        vibrator.cancel();
                    }
                }
            }
        );
    }
}

删除remote-tracking branch。但是当地分支机构更新local branch是一种好习惯吗?如果是,是否还有其他用途?

2 个答案:

答案 0 :(得分:2)

首先,让我们定义术语远程跟踪分支。远程跟踪分支只是一个引用,其完整拼写以refs/remotes/开头,例如示例中的refs/remotes/origin/master。在与Git的大多数正常交互中,我们删除refs/remotes/部分并且只写origin/master,但有时 - 与较低级别,面向脚本的Git命令一样,或者在执行像您的示例这样的奇怪事情时 - 它&# 39;必须完全拼写出来。

现在,远程跟踪分支的目的是保持追踪存储在分支上的ID < strong>远程 s(因此得名)。因此,如果我们仔细查看您的问题:

  

...正在通过本地分支更新远程分支这是一个好习惯吗?

我们需要注意一些事情:这不是更新&#34;远程分支&#34; (我们尚未真正定义),而是更新远程跟踪分支,即名称以refs/remotes/开头的其中一个本地实体。我们还要注意,您明确地删除远程跟踪分支(这是一种非常严格的更新形式:-))。

尽管如此,假设你只是说了一句话而且确实意味着&#34;远程跟踪分支&#34;:这样更新它是一种好习惯吗?不一般,没有。

但是,让我添加更多背景。我还需要在这里定义术语 refspec 。 refspec只是一对引用(如masterorigin/master,或其完全拼写的版本,分别为refs/heads/masterrefs/remotes/origin/master),以冒号{{分隔1}}角色。左侧的引用称为源或 : ,右侧的引用称为目标或 src 。 (可选)您可以在配对前加上加号[{1}},最多省略 dst 和/或 + 。如果省略 src ,您可以(也可能)省略冒号:例如dst是没有目的地的来源。省略 dst 时需要冒号:git fetch origin master不能拼写为src

(当你忽略一半refspec时,的意思git push origin :foogit push origin foo之间变化。我不会完全描述这一点,只是足以覆盖这里感兴趣的案例。)

通过git fetchgit push

进行更新

自Git版本1.8.4起,git fetchgit push都会机会性地更新远程跟踪分支。也就是说,如果您有Git联系人远程 R 并获取或设置其分支 B ,并且您的配置说明要跟踪{em> B {1}}(正常设置),你的Git将(从1.8.4开始)更新远程跟踪分支。 (在1.8.4之前,Git对git push进行了机会更新,但对git fetch进行了机会更新。)

已删除分支和refs/remotes/R/B

只需运行push(无需额外的refspecs)即可更新所有fetch远程跟踪分支机构。但是假设您之前已经执行了此操作,并且您的Git已将--prune分支复制到git fetch origin,从那时起,某人已删除分支refs/remotes/origin/ xyz refs/remotes/origin/xyz 1}}?

今天发生的事情是你的Git会保留你的xyz(大概是你还在使用它的时候)。要告诉您的Git它应该自动修剪您拥有的远程跟踪分支(远程不再具有该分支),只需将origin(或origin/xyz)添加到您的命令中:

--prune

您的Git现在删除您在-p下列出的任何远程跟踪分支,该分支仍未跟踪名为$ git fetch --prune origin 的远程实际分支。

您也可拼写:

origin

并且在某些Git版本中存在一些错误,其中两个命令中的一个有效,另一个没有(我不确定哪个版本,哪个版本成功)。

手动更新

作为一般规则,您应该让Git自动更新远程跟踪分支。有几种特殊情况,您可能希望手动更新它们,例如手动修改配置以更改远程名称,或更改应用于远程(origin行)的映射,或遇到像我刚才提到的那样的bug。或者,例如,如果您刚刚使用了无源git remote update --prune origin remote.remote.fetch来删除分支 - git push - 并且您的网络连接速度非常慢,你可能太急于跑git push --delete并等待。

在这种情况下,虽然git push origin :foo 从您的存储库中删除git fetch -p origin,但您也可以使用更直接的命令:

git push . :refs/remotes/origin/foo

事实上,对远程跟踪分支的任何更新都可以通过origin/foo(或基础&#34;管道&#34;命令,$ git branch -r -d origin/foo Deleted remote-tracking branch origin/foo (was 5ace313). )完成,就像对本地分支的更新一样通过git branch -r完成(没有git update-ref)。我认为有充分理由使用git branch来更新分支的唯一地方是实现-r的结果而不实际检查分支。 1

1 具体而言,git push .尝试快速转发本地ID git merge --ff-only - 这可以解析为有效的任何内容对象ID - 参考 git push . x:y 。当 x 是本地分支时,它相当于:

y

除了它根本不触及工作树。除了原子性和类型检查问题以及可能的符号引用问题之外,它也相当于这个shell命令序列:

y

请注意,git checkout y && git merge --ff-only x && git checkout - 会将x="$1" y="$2" # resolve x to an object ID xid=$(git rev-parse $x) || exit # resolve y to a reference yref=$(git rev-parse --symbolic-full-name $y) || exit [ -z "$yref" ] && { echo "fatal: $y: not a valid reference"; exit 1; } # make sure the current value of y is an ancestor of (resolved) x git merge-base --is-ancestor $yref $xid || { echo 'not a fast forward'; exit 1; } # ok, it is a fast forward: update git update-ref -m "fast forward" $yref $xid 之类的符号引用解析为其引用的名称,例如--symbolic-full-ref。这可能不合适,但origin/HEAD没有明显的标志来验证引用名称是否有效并将其转换为完全限定,但不会将符号名称扩展到其目标。

答案 1 :(得分:0)

我不太确定你在问什么。如果你想要一种替代方法来删除这样的远程分支,那就是:

git push origin --delete branchName

当我通过本地更新遥控器时,我已确保git历史记录排成一行,因此没有强制推动。

当我通过本地删除遥控器时,就是当分支的功能已经实现,并且刚刚完成了对主控的拉取请求。远程分支中的所有更改现在都在master中,因此我们可以安全地删除分支。