git remote操作(添加远端,初始化仓库)
对git的操作是围绕3个大的步骤来展开的:
-
从git取数据(
git clone
,或者建立仓库git init
、git remote add url
) -
改动代码(
git add .
或者git rm xxx
或者git commit -m "..."
等等) -
将改动传回 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 init
和 git 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