git进阶操作
如果文件在新分支a中进行了写操作,但并没add和commit,在master中可以看到A中的写操作,如果进行了commit,master就无法看到。删除之前,建议先合并。(注意:master在merge时候,如果遇到冲突并解决,则解决冲突会进行2次提交,1次是最终提交,1次是将对方的提交信息也拿来。工作区---add----暂存区----commit----对象区---push---git服务器。
一、git 基础概念1.
1.1 三种状态:
工作区(unstage)——已修改(modified)
暂存区(stage)——已暂存(staged)
对象区——已提交(commited)
工作区---add----暂存区----commit----对象区---push---git服务器
1.2,git init:将该路径纳入git管理
版本库删除:rm -rf .git
1.3,git status 查看状态
在哪个分支、是否提交、是否跟踪
1.4,工作区--->暂存区:git add hello.txt
1.5,工作区<---暂存区:git rm --cachede hello.txt
1.6,暂存区--->对象区:git commit -m "message"
1.7,工作区<---对象区:修改hello.txt
1.8,git log:查看git log日志;
git log -n 最近的次数】
git log --pretty=oneline
1.9,sha1值:md5加密算法随机数 分布式id生成器,用于区分哪一次提交,并且不重复
二、git操作与系统操作及ignore
2.1 git rm 删除文件会到暂存区:(1) 删除,(2)暂存区
>git rm b.txt
>如果彻底删除:git commit -m "彻底删除b.txt"
系统命令rm:删除到工作区
2.2 后悔操作:
(1)恢复工作区
git reset HEAD b.txt
(2)checkout
git checkout -- b.txt
通过git status查看再哪个区
2.3 修改注释
git commit --amend -m "修正" #修正前一次commit
2.4 忽略文件git ignore
创建ignore:touch .gitignore
vi .gitignore,将要忽略的文件写入
通配符:
(1) * 任意字符:*.properties
(2) !与 * 一起使用:
*.properties
!b.properties
(3) 目录
dir/ 忽略文件夹
dir/*.txt
dir/**/*.txt 忽略任意级目录
默认忽略空文件夹
2.5 分支:开发到一半建分支
(1)查看分支:git branch
(2)创建分支:git branch xx
(3) 切换分支:git checkout xx分支
(4)删除分支:git branch -d xx分支 (不能删除当前分支,如果存在未合并分支,不能删除。删除之前,建议先合并。-D 强行删除)
(5)先创建分支并切换:git checkout -b new-branch
(6)合并分支:git merge new-branch
(7)新分支写操作
如果文件在新分支a中进行了写操作,但并没add和commit,在master中可以看到A中的写操作,如果进行了commit,master就无法看到。
如果文件在新分支a中进行了写操作,但并没add和commit,如果删除分支,是可以成功的。
(8)git branch -v
分支最近一次sha1值的前几位。
分支:是一个commit链,工作记录线。
分支名:master 指向当前的提交commit
HEAD指向当前分支
cd .git
cat HEAD 可以看到HEAD的指向分支
(9)master合并bev:通过合并直接追赶bev——fast forward 分支指针的移动
git checkout master
git merge bev (会复制bev中间的过程。master和bev指向同样的commit)
fast forward:1-两个分支会归于一点,2-会丢失分支信息
git 在merge时,默认使用fast forward,
也可以禁止:git merge --no-ff ,1-两个分支不会归于一点,主动合并分支会前进一步
2-分支信息完整,不会丢失分支信息
(10)合并:如果冲突,需要解决冲突,merge 默认fast forward
merge 冲突:1-先修改vi ,2-git add完,再次提交
现在的git add不是从工作区到暂存区,这里的add只是告知git,解决冲突。
git add a.txt
git commit -m "解决冲突"
解决冲突时,需要感知bev内容,会触发bev操作,所以会把bev的b7d9f的操作一起合并过去。
(注意:master在merge时候,如果遇到冲突并解决,则解决冲突会进行2次提交,1次是最终提交,1次是将对方的提交信息也拿来。)
解决完冲突,master的内容,仍然与bev不同。master比bev先一步。
如果此时bev去合并master,是否会冲突?此时不会再报冲突。
如果落后一方合并前面一方,则不会冲突。如果两方不是处在一条链上进行合并,则合并会冲突。
(11)git log --graph 图形法验证。
git log --graph --pretty=oneline --abbrev-commit
2.6,版本回退 版本穿梭,在多个commit之间穿梭:回退、前进
git commit -am "先add再commit",第一次不能用
回退到2次commit:git reset --hard HEAD^^ 几个^回退几次
回退到前n次commit:git reset --hard HEAD~n
回退到前某一次commit:git reset --hard 803c9 (sha1值的前几位)
git reset之后,后面的git log记录都不见了,如果想回到后面某一分支,可通过下面操作:
git reflog:查看log记录,记录所有操作,帮助我们实现后悔操作,借助于良好的commit注释习惯
git reset --hard sha1
2.7 checkout放弃修改,放弃的是工作区的修改,相对于暂存区
git reset HEAD a.txt
reset:将之前增加到暂存区的内容,回退到工作区
checout :版本穿越、版本游离
git checkout sha1值 直接穿越回前面某一版本
(1)修改后,必须提交;不然报错。修改后,如果提交,虽然不报错,但是后面的版本仍然不知道前面版本做的修改,所以,这个时候最好创建新分支。
(2)创建分支的好时候
git branch new-branch 2735603
分支重命名:
git branch -m branch1 branch2
stash:保存现场
1-建议:在功能未开发完前,不要commit
2-规定:在没有commit之前,如果两个分支在同一时刻,则可以checkout切换。如果两个分支不在同一个阶段, 则不能checkout。解决办法:
1-要么提交在切换分支,
2-要么用stash操作保存现场:
一次保存:git stash 即可。
二次保存:git stash save "mystash"
git checkout dev,切回未完成分支后,原来内容如何恢复?
查看现场:git stash list
还原现场(默认还原最近一次):
git stash pop (将原来保存的删除,用于还原内容)
git stash apply(还原内容,但不删除)
git stash drop stash@{0} (手动删除stash)
git stash apply stash@{0} (可以恢复指定stash)
stash也有冲突的情况:一次修改内容,stash后,二次修改同部分内容,并进行commit,如果此时再用stash恢复第一次修改的现场,则恢复的现场核二次修改的内容冲突。
打标签:适用于整个项目,和分支没关系。
(1)git tag v1.0
(2)git tag -a v2.0 -m "release tag"
查看tag:git tag
删除tag:git tag -d v1.0
blame:责任
git blame a.txt 查看a.txt的素有提交commit sha1值,以及每一行的作者。
diff:比较差异
diff a.txt b.txt
diff -u a.txt b.txt 内容更多一些
三、本地与远程冲突
本地主分支 master
远程主分支 origine/master
3.1 push 推送
commit 使得本地主分支向前更新
push 使得远程分支向前一步
pull 使得本地主分支向前更新,属于fast forward,自动合并。
查询远程:git remote show origin
3.2 冲突:两人同时改同一部分内容
git add . 不要用 git add * (无法忽略ignore)
fetch first:
git pull
(pull= fetch + merge)
pull失败,可能就是merge失败:(1)vi解决冲突,(2)git add . 然后git commit -m “**”
总结:本地操作
pull--vi--add--commit--push
3.3 git gui:gitk的、gui、github desktop
3.4 日志 git log
看本地日志 git log
看远程日志 git log refs/remotes/origin/master refs和remotes可有可无
四、本地与远程的关联
git push -u remote master ,本地master与远程master关联
如果本地新建dev分支,再push的时候远程因为没有dev所以不知道往哪push
(1)git push -u remote dev
(2)git push --set-upstream remote dev
如果远程有新dev,本都没有:先追踪,再关联
(1)git pull ,远程--追踪(本地的远程分支);
(2)追踪--本地:(i)git checkout -b dev origine/dev
(ii) git checkout -b test --track origine/test
删除分支:git branch -d 分支名
删除远程分支:
git push origin src:dest
(1) git push origin 空格:test
(2)git push origin --delete dev
git branch -av 查看分支
把本地分支推到远程分支:
git push origin dev:dev2
git push origin HEAD:dev2
pull 也一样
git pull origin ccc2:ccc3,相当于git pull 先跟踪,再加上关联 git checkout -b dev origin/分支名
本地没有a分支,但本地却感知远端的a分支,
检测:git remote prune origin --dry-run
删除:git remote prune origin 清空本地无效的远程分支
将远端分支拉取到本地新分支:
cd .git/refs/remotres/origin/
git fetch origin master:refs/remotes/origin/新建分支
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)