git show-ref 查看本地全部引用
jagent@ubuntu:~/xin/user1$ git show-ref
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/heads/master
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/heads/user1/openuser1
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/remotes/origin/HEAD
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/remotes/origin/master
其中远程分支引用为refs/remoters/origin/为前缀
git branch -r查看远程分支
jagent@ubuntu:~/xin/user1$ git branch -r
origin/HEAD -> origin/master
origin/master
从远程仓库拉去到本地版本库分支中都在.git/refs/remotes/origin/下
origin/HEAD -> origin/master为什么拉下来的都是这种形式
因为在.git/config中
[remote "origin"]
url = ssh://xwx496887@10.148.192.216:29418/ST/mytest
fetch = +refs/heads/*:refs/remotes/origin/*
设置了本地仓库执行git fetch origin操作时默认引用表达式
远程分支并不是分支而是引用,如果检出,一样会使工作区处于分离头指针状态。如果需要对远程分支进行修改就需要创建新的本地分支
x为了追踪远程分支refs/remotes/origin/hello-world进行工作,就需要基于该远程分支创建本地分支。远程分支可以简写为origin/hello-world
git checkout hello-world
建立分支追踪后本地分支就具有下列特征:
检查工作区状态时,会显示本地分支和被跟踪远程分支提交的关系
当执行git pull命令时,会和被跟踪的远程分支进行合并(或者变基),如果两者出现版本偏离的话
当执行git push命令时,会被推送到远程版本库的同名分支。
意思是本地分支应和.git/config中的branch "master"对应建立关系
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = ssh://xwx496887@10.148.192.216:29418/ST/mytest
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = user1
email = user1@126.com
如果不同就会出现下列情况:
jagent@ubuntu:~/xin/user1$ git show-ref
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/heads/hello
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/heads/master
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/heads/user1/openuser1
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/remotes/origin/HEAD
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/remotes/origin/hello
5270a81bf201b905c23f0a748b7e4a44f22fb805 refs/remotes/origin/master
jagent@ubuntu:~/xin/user1$ git branch
* hello
master
user1/openuser1
jagent@ubuntu:~/xin/user1$ git status
On branch hello
nothing to commit, working directory clean
jagent@ubuntu:~/xin/user1$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> hello
如果执行git push origin 分支/HEAD(本地分支)等 推送对应分支上,但是执行git pull是拉不下来的远程分支的版本库的。
可以使用参数--track基于master创建hello此时HEAD的指向是一致的
jagent@ubuntu:~/xin/user1$ git checkout --track -b hello master
Branch hello set up to track local branch master.
Switched to a new branch 'hello'
jagent@ubuntu:~/xin/user1$ git branch
* hello
master
user1/openuser1
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = ssh://xwx496887@10.148.192.216:29418/ST/mytest
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = user1
email = user1@126.com
[branch "hello"]
remote = .
merge = refs/heads/master
会增加一个分支的参数
xxxxxxxxxx
1.注册远程版本库
git remote add remotename url
jagent@ubuntu:~/xin/user1$ git remote -v
origin ssh://xwx496887@10.148.192.216:29418/ST/mytest (fetch)
origin ssh://xwx496887@10.148.192.216:29418/ST/mytest (push)
jagent@ubuntu:~/xin/user1$ git remote add test ssh://xwx496887@10.148.192.216:29418/ST/mytest1
jagent@ubuntu:~/xin/user1$ git remote -v
origin ssh://xwx496887@10.148.192.216:29418/ST/mytest (fetch)
origin ssh://xwx496887@10.148.192.216:29418/ST/mytest (push)
test ssh://xwx496887@10.148.192.216:29418/ST/mytest1 (fetch)
test ssh://xwx496887@10.148.192.216:29418/ST/mytest1 (push)
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = ssh://xwx496887@10.148.192.216:29418/ST/mytest
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = user1
email = user1@126.com
[branch "hello"]
remote = .
merge = refs/heads/master
[remote "test"]
url = ssh://xwx496887@10.148.192.216:29418/ST/mytest1
fetch = +refs/heads/*:refs/remotes/test/*
想要获取刚添加的版本库的信息需要git fetch test 如果执行git fetch默认是origin
jagent@ubuntu:~/xin/user1$ git fetch test
warning: no common commits
remote: Counting objects: 11, done
remote: Finding sources: 100% (11/11)
remote: Total 11 (delta 0), reused 9 (delta 0)
Unpacking objects: 100% (11/11), done.
From ssh://10.148.192.216:29418/ST/mytest1
* [new branch] master -> test/master
* [new branch] user2/i18n -> test/user2/i18n
* [new branch] v1.0 -> test/v1.0
* [new branch] v2.0 -> test/v2.0
jagent@ubuntu:~/xin/user1$ git branch -r
origin/HEAD -> origin/master
origin/hello
origin/master
test/master
test/user2/i18n
test/v1.0
test/v2.0
如果此时拉取版本还是从origin/HEAD -> origin/master
那如何更改远程版本库的地址呢
第一种,更改git remote中的地址等信息
第二种使用git remote命令
git remote set-url test ssh://xwx496887@10.148.192.216:29418/ST/mytest2
jagent@ubuntu:~/xin/user1$ git remote -v
origin ssh://xwx496887@10.148.192.216:29418/ST/mytest (fetch)
origin ssh://xwx496887@10.148.192.216:29418/ST/mytest (push)
test ssh://xwx496887@10.148.192.216:29418/ST/mytest2 (fetch)
test ssh://xwx496887@10.148.192.216:29418/ST/mytest2 (push)
这种改变是二种fetch 和push
如果单独修改
git remoter set-url --push test ssh://xwx496887@10.148.192.216:29418/ST/mytest2然后和.git/config中随之改变
2.更改远程版本库的名称
git remoter rename test test1
3.远程版本更新
git remote update
如果关闭自动更新 git config remote.test.skipDefaultUpdate true
4.删除远程版本库
git remote rm user2
xxxxxxxxxx
git push 不带参数 的过程:
如果当前分支设置了<remote>,配置.git/config中branch.<branchname>.remote给出了远程版本库代号,则git push相当于执行了git push <remote>
如果当前分支没有设置<remote>,则相当于执行了git push origin
要推送远程版本库的URL地址又配置.git/config中的remote.<remote>.pushurl,如果没有则使用remote.<remote>.url配置的URL地址,如果通过set-url --push注册的,那么通过remote.<remote>.push的引用表达式推送
使用":"引用表达式,意思用同名分支推送
一般我们使用git push <remote> <new_branch>,相当于先建立远程分支然后再推送,但是不能执行git pull操作。
git pull 不带参数的过程:
如果当前分支设置了<remote>,配置.git/config中branch.<branchname>.remote给出了远程版本库代号,则git pull相当于执行了git pull <remote>
如果当前分支没有设置<remote>,则相当于执行了git pull origin
要获取的远程版本库的URL地址由remote.<remote>.url
如果远程版本库设置了fetch参数,即通过remote.<remote>.fetch配置了一个引用表达式,则使用该引用表达式执行获取操作
确定合并的分支。如果设定了branch.<branchname>.merge,则对其设定的分支执行合并,否则报错退出
在执行git pull操作的时候可以通过参数--rebase设置进行变基操作,如果没有加隐式执行git merge进行合并操作,避免忘记使用--rebase参数导致分支的合并 可以使用 git config branch.<branchname>.rebase true,如果这样设置了在<brachname>工作分支执行git pull命令,遇见本地分支和远程分支出现偏离的情况,才执行变基操作,而不是默认的合并操作。
如果为本地版本库设置参数branch.autosetuprebase的值为true,基于远程分支建立本地追踪分支时会自动配置branch.<branchname>.rebase参数,在执行git pull命令会使用变基线操作
xxxxxxxxxx
执行git fetch命令,设置不获取里程碑只获取分支及提交,可以通过提供-n或者--no-tags参数实现。
git fetch --no-tag url refs/heads/*:refs/remotes/hello-world/*
也可以在注册远程版本库
git remote add --no-tags <remote-name> url
里程碑的安全性:
1.用reflog记录对分支的操作历史
默认创建带工作区的版本库都包含core.logallrefupdates为true的配置,每个分支创建对应reflog,裸版本默认不包含这个设置。即不会为每个分支创建对应的reflog
2.关闭非快进式推送。
如果将配置receive.denyNonFastForwards设置为true,禁止一切非快进式推送,但是有些不合适,更好方法搭建SSH协议的git服务器,通过钩子脚本灵活配置,工作一般使用代码托管工具控制,如gerrit权限
3.关闭分支删除功能
如果将配置receive.denyDeletes设置为true,则禁止删除分支,通过搭建SSH协议的git服务器,配置分支删除的用户权限,工作一般使用代码托管工具控制,如gerrit权限