基本概念
查看完全关系 git branch -vv 获得服务器上最新的关系 git fetch --all git branch -vv 推送到远程版本 git push origin -d branchName
origin 远程服务器
origin/master 远程分支
master 本地分支
HEAD 当前版本的意思
说简单一点,HEAD就是当前活跃分支的游标。
HEAD指向master,而master指向的是最近的一次提交
HEAD是当下的分支,当切换分支时 HEAD指向新的。
如果指向一个没有名字的分支,叫做detached HEAD。
小写的head应该是指commit对象引用,每个head有独立名字
具体来说 每个master默认一个head然后可以不断再加
和commit应该是对应的,只要他是current head 那其实就是HEAD
写法上来说,基本可以看到git pull和git push 是喜欢 origin xxx:xxx 或 origin xxx 这样,而git checkou git branch 喜欢 origin/xxx 这样。
本地、远程和追踪分支
git branch
删除本地分支
git branch –xx dev
-d是–delete的缩写,在使用–delete删除分支时,该分支必须完全和它的上游分支merge完成,如果没有上游分支,必须要和HEAD完全merge
-D是–delete –force的缩写,这样写可以在不检查merge状态的情况下删除分支
–force简写-f,作用是将当前branch重置到初始点(startpoint).如果不使用–force的话,git分支无法修改一个已经存在的分支.
删除远程分支和追踪分支(关系)
git push origin –delete remotebranch
该指令也会删除追踪分支(关系)
删除追踪分支
注意git branch -a里看不到 但是其实还在 要你重新设定上游分支
git branch -d –remotes 可以删除追踪分支(关系)
该操作并没有真正删除远程分支,而是删除的本地分支和远程分支的关联关系,即追踪分支(关系)
设定新的上游分支
git branch -u origin/cccc
创造一个新的远程分支
git push origin localbranch:remotebranch
除了这个是服务器 本地端 远程端 其他基本都是 服务器 远程端:本地端
总之,像操作服务器上版本 还是得用git push origin 这个开头 然后貌似 最后的参数都是remotebranch
重命名本地
git branch -m #modify# oldname newname
说下git branch git push 时 带-u 和不带 -u 区别
带u参数表示 并设置后面的服务器版本为上游分支
不带 则不会设置
例如git merge dev
这时候master指向了Dev的最近一次提交。而head指向当前分支即master
这时候可以删除掉Dev
使用 git branch -d dev
origin/master 远程分支 上游分支 upstream branch -> master本地分支 被追踪分支 tracking branch
git checkout
git checkout
git checkout [branch]
如果checkout的分支本地不存在,但是和远程分支名一样,git会自动创建追踪分支,并且切换到该分支
创建并设定上游分支(如果上游分支还没有那先创建个上游)
git checkout -b aaa origin/bbb这样本地aaa为远程bbb的追踪分支.
这个是最推荐的 如果用其他方式要记住先确定本地branch干净在制定追踪
设定上游分支
git checkout –track origin/dev
分支被设定为追踪 服务器为origin上的远程分支dev 并切换到dev分支上
git clone
1.自动将远程服务器命名为origin
2.下载该服务下的所有数据
3.创建一个指向master分支的指针,并将该分支命名为origin/master
4.创建名为master的本地分支,并且和远程分支在同一个提交节点
设定服务器名称
git clone -o (origin) cat
则repo最终为 cat/master
git merge
如果在master分支上,可以通过git merge @{u}等指令来代替git merge origin/master
git merge master Guo
git merge Guo
git diff Guo
git fetch
FETCH_HEAD 本地的文件,是版本链接,指向远程库取下的分支的末端版本
commit-id 唯一标识一个版本的序列号 commit时先在本地 push时同步到远程库
git fetch 更新服务器中远程库的最新commit-id 记录到本地.git/FETCH_HEAD文件中。git fetch origin –prune或它的简写git fetch origin -p来单独删除追踪分支(关系)。
完整流
git fetch origin master:tmp
git diff tmp
git merge tmp
git branch -d tmp
git fetch origin
默认拉到master
git fetch origin dev
拉远程的fetch-head 拉远程dev的提交
git pull
git pull [远程主机名] [远程分支名]:[本地分支名]
git pull 时git会自动知道需要获取和merge的分支的服务器.
有选择合并git fetch 直接快捷合并git pull
git push
git push origin HEAD:guo #貌似这个刚刚新建时要制定HEAD
git push origin guo #貌似这个 只要云端和本地不同名就不醒??? 同名的测试了这种写法都没问题
git push #缩写 自动传到同名
用列表的形式汇总下
- commit提交和push是两个东西 本地没网也可以一直commit 但是push上才算是记录在云端了 能被别的协作者看到
- 追踪和 未追踪是两个概念 未追踪是无法commit的 追踪的文件才有commit资格
对于未追踪文件 通过git add 转换为追踪文件 - pull 是相当于 fetch+merge+diff 然后本地push只是push 很多时候会和云冲突 保有先pull再push的习惯
- 从三个用于撤销的命令来对比
checkout 针对未commit的修改 撤回
revert 针对已commit的修改直接再用commit去撤回
reset 直接就把已有commit记录给抹去了 而上面两个是动不了已有的commit记录的 - git push origin HEAD:guo 如果本地branch名和云端不一样 只能这样push,,很麻烦呐
疑难问题汇总
用户A
commit 1
pull
服务器有行
commit 2
服务器有行
用户B 早上pull 发现文件里少行 -》 服务里是少行的版本
产生矛盾,,解释不了这一点
发表评论