git进阶操作

一、git 基础概念1.

1.1 三种状态:

工作区(unstage)——已修改(modified)

暂存区(stage)——已暂存(staged)

对象区——已提交(commited)

git进阶操作_第1张图片

工作区---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指向当前分支

git进阶操作_第2张图片

cd .git

cat HEAD 可以看到HEAD的指向分支

(9)master合并bev:通过合并直接追赶bev——fast forward 分支指针的移动

git checkout master

git merge bev (会复制bev中间的过程。master和bev指向同样的commit)

git进阶操作_第3张图片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进阶操作_第4张图片

现在的git add不是从工作区到暂存区,这里的add只是告知git,解决冲突。

git add a.txt

git commit -m "解决冲突"

git进阶操作_第5张图片

解决冲突时,需要感知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进阶操作_第6张图片

git reset --hard sha1

2.7  checkout放弃修改,放弃的是工作区的修改,相对于暂存区

git进阶操作_第7张图片

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

git进阶操作_第8张图片

 

3.3 git gui:gitk的、gui、github desktop

3.4 日志 git log

看本地日志 git log

看远程日志 git log refs/remotes/origin/master  refs和remotes可有可无

git进阶操作_第9张图片

四、本地与远程的关联

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/新建分支

        

你可能感兴趣的:(git)