新建远端分支,git clone & git fetch/pull & push & git branch & git remote & origin master

git remote操作(添加远端,初始化仓库)

对git的操作是围绕3个大的步骤来展开的:

  1. 从git取数据(git clone,或者建立仓库 git initgit remote add url

  2. 改动代码(git add . 或者 git rm xxx 或者 git commit -m "..." 等等)

  3. 将改动传回 git(git push

    这 3 个步骤又涉及到两个 repository,一个是 remote repository,在远程服务器上,一个是 local repository,在自己工作区上。其中步骤1, 3 涉及到 remote server/remote repository/remote branch;步骤2 涉及到 local repository/local branch。

    git clone 会根据你指定的remote server/repository/branch,拷贝一个副本到你本地,在 git push之前,你对所有文件的改动都是在你自己本地的 local repository 来做的,你的改动(local branch)和 remote branch 是独立(并行)的。

如图:
这里写图片描述

git clone

clone完成之后,git 会自动为你将此远程仓库命名为origin(origin只相当于一个别名,运行git remote –v或者查看.git/config可以看到origin的含义),并下载其中所有的数据,建立一个指向它的 master 分支的指针,我们用(远程仓库名)/(分支名) 这样的形式表示远程分支,所以 origin/master 指向的是一个 remote branch(从那个branch我们clone数据到本地),但你无法在本地更改其数据。
如果不是 clone 则可以使用 git initgit remote add 语法为 git remote add [shortname] [url],例如:

$git remote -v  // 查看是否有设置的远端仓库(origin)
$git remote add origin https://github.com/fengzhuye/cpp-learn.git
$git remote add origin ssh://git@xxx.git
$git remote rm origin  // 如果需要更新远端,删除重建,或者使用下面 set-url
$git remote set-url origin URL

因此,以下两个命令块几乎是等价的:

# git clone https://github.com/fengzhuye/cpp-learn.git

vs:

# mkdir foo
# cd foo
# git init
# git remote add origin https://github.com/fengzhuye/cpp-learn.git
# git pull origin master
 至此,一个仓库就建好了,但是如果要使用默认的 push & pull(而不是: git pull origin master),则还需要使用 --set-upstream-to (见下文)

如果你只想 clone 某一个分支,而不是吧整个仓库拷贝下来

git clone --single-branch --branch <branchname> <remote-repo>

注意上面命令(带 --single-branch)与下面这个的区别(拷贝整个仓库并且切换到对应分支):

git clone --branch <branchname> url  # fetching all the branches and checking out one

git remote add 与 git clone的区别有个链接

git remote add just creates an entry in your git config that
specifies a name for a particular URL. You must have an existing git
repo to use this.

git clone creates a new git repository by copying an existing one
located at the URI you specify.

clone 的同时,git 会建立一个属于你自己的本地 master 分支,它指向的是你刚刚从 remote server 传到你本地的副本。随着你不断的改动文件,git add, git commit, master的指向会自动移动,你也可以通过merge(fast forward)来移动master的指向。

 $git branch -a (to show all the branches git knows about)

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master


$git branch -r (to show remote branches git knows about)

  origin/HEAD -> origin/master

  origin/master

可以发现,打星号的 *master 就是 local branch,origin/master 是 remote branch(master is a branch in the local repository. remotes/origin/master is a branch named master on the remote named origin

$git diff origin/master master # show me the changes between the remote master branch and my master branch.

需要注意的是,remotes/origin/master 和 origin/master 的指向是相同的

$git diff origin/master remotes/origin/master  # 相同

git push

git push origin master

其中 origin 指定了你要 push 到哪个 remote,master 其实是一个"refspec" (e.g. refs/heads/master),正常的“refspec”的形式为 “+<src>:<dst>” ,冒号前表示 local branch 的名字,冒号后表示 remote repository 下 branch 的名字。注意,如果你只写一个(<src>),即省略了<dst>,git就认为你想 push 到 remote repository 下和 local branch 相同名字的 branch。听起来有点拗口,再解释下,push是怎么个push法,就是把本地branch指向的commit push 到 remote repository下的 branch,比如:

$git push origin master:master (在local repository中找到名字为master的branch,使用它去更新 remote repository下名字为 master的 branch,如果 remote repository 下不存在名字是 master 的branch,那么新建一个)

如果是及想要将当前分支的最新commit push 到 remote repository, 使用这个比较方便:

git push origin HEAD:dev  #即将当前分支的修改push到仓库中的dev分支上。

$git push origin master (省略了<dst>,等价于 git push origin master:master,如果仓库上没有 master分支,则会新建一个。)

$git push origin master:mybranch (在local repository中找到名字为 master 的 branch,用他去更新 remote repository 下面名字为 “mybranch” 的 branch, 如果 mybranch不存在则新建)

$git push origin HEAD: mybranch (HEAD指向当前工作的branch的最新的commit,不一定是master分支,所以我觉得用HEAD方便些)

$git push origin :mybranch (在 origin repository 里面查找mybranch,删除它。用一个空的去更新它,就相当于删除了)

尊重原作,原文链接


git branch 远端分支:

1,从已有的分支创建新的分支(如从master分支),创建一个dev分支

git checkout -b dev  // 或者分两步(新建,切换) git branch dev; git checkout dev

2,创建完可以查看一下,分支已经切换到dev

git branch  // 或者 git branch -a (查看本地和远程所有分支)

    * dev

    master

3,提交该分支到远程仓库

git push origin dev  // origin 为远端仓库别名,dev 为远端分支(如果不存在则新建之)
// 删除远端分支 dev
git push origin :dev   // 分支名前的冒号代表空,将远端变为空即删除的意思)

4,测试从远程获取dev

git pull or git fetch & git rebase -p …

// 最好用git fetch, 主机名一般为 origin,随便哪个分支
// 如果一个本地分支叫dev123, 且是这个分支track对应远程分支,则其对应的远程分支一般叫 origin/dev123
git fetch <远程主机名> <分支名>
例如: git fetch origin master
## 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支;
$ git fetch origin master:temp
## 比较本地代码与刚刚从远程下载下来的代码的区别;
$ git diff temp
## 合并temp分支到本地的master分支;
$ git merge temp
## 如果不想保留temp分支,删除;
$ git branch -d temp



// pull远端分支代码到本地当前分支(建议使用)
git pull origin dev

// 如果你本地已经有你的修改,并且已经commit:
git pull --rebase origin dev  # 这样可以成一个 linear commit history,否则merge会很乱
// check this: https://derekgourlay.com/blog/git-when-to-merge-vs-when-to-rebase/
// so...
git fetch origin develop  # 拉取远端分支 develop 
git rebase −p origin/develop  # 将当前分支 rebase 到 远端分支 develop 上


// 或者,把远程分支拉倒本地,并建立关联关系track(否则需要使用 --set-upstream-to):
git checkout --track origin/dev

或者:

如果用命令行,运行 git fetch,可以将远程分支信息获取到本地,再运行 git checkout -b local-branchName origin/remote_branchName 就可以将远程分支映射到本地命名为local-branchName 的一分支

5,我觉得现在重要的就是设置git push,pull默认的提交获取分支,这样就很方便的使用 git push 提交信息或 git pull 获取信息


// 建立track关系,使用:
git branch  --set-upstream-to=origin/<远端branch_name> <本地branch_name>
//  例如: 将当前分支(默认)设置为跟踪远端 dev 分支
git branch --set-upstream-to=origin/dev

//  例如: 将master设置为跟踪远端 dev 分支
git branch --set-upstream-to=origin/dev master
或者:git branch -u origin/dev master

输出消息:
	Branch 'master' set up to track remote branch 'dev' from 'origin'.

除了建立 track 关系,还要设置默认的 pull push 方式,详见:
git config --local push.default  # 仓库中的 .git/config 中设置的,优先级高
git config --local pull.default
git config --globa push.default # 全局默认的,优先级低
git config --globa pull.default

取消对master的跟踪

git branch --unset-upstream master

6,现在随便修改一下工程文件的内容,然后 git commit ,git push 之后就可以直接提交到远程的 dev 分支中,而不会是 master

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值