Git常用命令

目录

一、常用命令

1、git init

2、git add

3、git commit -m “备注”

4、git status 与 git diff

5、git show commit_id  查看某次修改

6、git log 与 git reflow

7、git pull (--rebase)

8、git push (-u) 与 git branch (-u)

        1、git push -u 与 git push -u的区别?

        2、git push -u origin 与 git branch -u origin的区别?

9、git reset --hard 与 git cherry-pick

10、git checkout与git 分支

11、git help 与 git gui

二、撤销修改

1、撤销工作区修改(尚未add,尚未commit)

2、撤销暂存区修改(已经add,尚未commit)

3、撤销版本库修改(已经commit,尚未推送到远程)

4、版本回退

1、删除分支

2、代码回滚

三、删除文件

四、远程仓库

1、连上远程库

2、本地向远程推送内容

3、远程库的所有内容推送到本地库上

五、分制管理

1、基础命令

2、解决冲突

3、分制管理策略(禁掉快进模式)

4、BUG分支

5、Feature分支

6、多人协作

六、忽略上传

七、文件对比

八、高频操作

1、分支创建

2、更改commit的备注

3、版本回退

4、IDE上不同分支代码对比


一、常用命令

1、git init

        用于在目录中创建新的 Git 仓库。

2、git add

git add "文件名"

提交单个变更文件

git add .

提交所有变更文件

3、git commit -m “备注”

4、git status 与 git diff

git status

告诉你有文件被修改过

git diff

查看修改内容

git diff common/ > 1.diff   将common目录下的改动转存为1.diff

git diff

工作区(work dict)和暂存区(stage)的比较

git diff —cache

暂存区(stage)与分支(master)的比较

5、git show commit_id  查看某次修改
6、git log 与 git reflow

git log或者git log —pretty=oneline或者git log —graph —pretty=oneline —abbrev-commit

用git log --graph命令可以看到分支合并图

git --no-pager log -3 -p 查看最近3个版本的修改情况

--no-pager  不less分页显示了

-3修改3个版本

-p显示修改部分 

当多人协作开发一个分支时,git log --graph --pretty=oneline --abbrev-commit
查看历史记录通常如下方左图所示,比较凌乱。如果希望能像右图那样呈线性提交,就需要学习git rebase的用法。

git log查看提交历史,看要回退到哪个版本
git reflow查看命令历史,看要回退到哪个版本
7、git pull (--rebase)

        git pull时可以加上--rebase参数, 使之不产生Merge点, 保证了代码的整洁,
        git pull –rebase
        再次git log --graph--pretty=oneline --abbrev-commit,新的merge就会呈现右图的线性样式。
        但每次都加--rebase似乎有些麻烦,我们可以指定某个分支在执行git pull时默认采用rebase方式:
        git config branch.dev.rebase true  #dev修改成本地的分支名字
        如果你觉得所有的分支都应该用rebase,那就设置:
        git config --global branch.autosetuprebase always
        这样对于新建的分支都会设定上面的rebase=true了。已经创建好的分支还是需要手动配置的。

8、git push (-u) 与 git branch (-u)
        1、git push -u 与 git push -u的区别?

git push -u origin dev = git push origin/dev dev + git branch -u origin/dev dev 

        2、git push -u origin 与 git branch -u origin的区别?

                git push origin不指定远程分支,则默认的远程分支与本地分支一样
                git branch origin不指定远程分支,则默认的远程分支=master
        举例如下:
                git push origin dev = git push origin/dev dev
                git branch origin dev = git branch origin/master dev

综上,无论push还是branch,-u指定远程分支与本地分支的关联关系时,最好指定远程分支名:origin/远程分支名。然后像push报错,再报远程分支名去掉。

9、git reset --hard 与 git cherry-pick

        git reset —hard HEAD/HEAD^/HEAD^^/HEAD~100   回退到上几个版本
HEAD是当前版本,HEAD^上个版本,HEAD^^上上个版本,HEAD~100回退100个版本
        git reset —hard 3628164 回退到指定版本号,版本号不用写全

git reset --hard 回退代码。回退到某个commit_id
git cherry-pick摘草莓。摘取某个commit_id到当前分支下(只要这个commit_id存在就好,不在乎它在哪个分支下的)

场景1:代码回退

        dev分支修改,提交3次commit,然后合并到master,结果线上报错,吓得我直接revert这段合并,但是后来麻烦就来了。本来想着在现有基础上修复,又提交了一次commit提交,但是发现前3次的commit没了,想哭,原来是真的版本后退了,这3个commit消失得无影无踪。咋办?在本地dev分支下git log:见有图。

解决方案:

        git reset --hard 630391de81dba0a7e47e2ce2a0d10766460d706e

        git cherry-pick 31f91471a801ec9fc5d49e84cefccc5942c190a6

        git push origin dev  --force #必须强推,如果受保护的分支,先不保护,强推后再保护

场景2:一个分支摘取另一个分支的某个commit提交

10、git checkout与git 分支

git checkout 

(1)在本地当前分支的基础上,新建一个新分支
git checkout -b 分支名
(2)拉取远程分支去创建本地分支
git checkout -b 本地分支名 origin/远程分支名

git分支

(1)查看所有本地分支:git branch
         查看所有远程分支:git branch -r
         查看所有本地和远程分支:git branch -a
(2)用某个commit新建分支:git checkout -b 分支名 某次commit_id
(3)用远程分支新建分支:git fetch origin 远程分支名:本地分支名,然后,git checkout 本地分支名

11、git help 与 git gui

        git help是个可以查看所有git命令的手册,比如要查询 git branch相关参数,执行git help branch,然后OPTIONS字段就能看到所有git branch的所有参数及其解释。比如想看git branch -u的用法

git gui是git的图形操作界面

二、撤销修改
1、撤销工作区修改(尚未add,尚未commit)

        git checkout -- readme.txt

2、撤销暂存区修改(已经add,尚未commit)

        git reset HEAD readme.txt

        git checkout -- readme.txt

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

3、撤销版本库修改(已经commit,尚未推送到远程)

        git reset —hard HEAD^(版本回退)

4、版本回退
1、删除分支

        删除本地分支: git branch -D br

        删除远程分支: git push origin :br  (origin 后面有空格)

2、代码回滚

git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id
本地代码库回滚:
        git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除
        git reset --hard HEAD~3:将最近3次的提交回滚(HEAD~3可以改写成HEAD^^^)

远程代码库回滚:
        这个是重点要说的内容,过程比本地回滚要复杂
        应用场景:自动部署系统发布后发现问题,需要回滚到某一个commit,再重新发布
        原理:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支
操作步骤:
        1、git checkout the_branch
        2、git pull
        3、git branch the_branch_backup //备份一下这个分支当前的情况
        4、git reset --hard the_commit_id //把the_branch本地回滚到the_commit_id
        5、git push origin :the_branch //删除远程 the_branch
        6、git push origin the_branch //用回滚后的本地分支重新建立远程分支
        7、git push origin :the_branch_backup //如果前面都成功了,删除这个备份分支
        如果使用了gerrit做远程代码中心库和code review平台,需要确保操作git的用户具备分支的push权限,并且选择了 Force Push选项(在push权限设置里有这个选项)
        另外,gerrit中心库是个bare库,将HEAD默认指向了master,因此master分支是不能进行删除操作的,最好不要选择删除master分支的策略,换用其他分支。如果一定要这样做,可以考虑到gerrit服务器上修改HEAD指针。。。不建议这样搞

远程代码库master分支回滚
        在强推mster的可能会报错没有权限:You don't have permission
是因为master分支一般会成为保护分支,所以我们首先要去除master为保护分支,才可以强推。
####PS: 为分支开启保护########
*管理员可以开启
* 开启,无法强制推送
* 开启,无法被删除
* 只有测试全部通过才被接受合并
###########################
所以步骤如上,部分改动如下:
只不过第4,5步中间加上去除master为保护分支,
第6步强推:push -u origin master -f
最后当恢复完成,要把master分支重新设为受保护分支

标签和分支的对比

三、删除文件

        git add test.txt,  git commit -m "add test.txt" 

        rm test.txt  从工作区删除该文件

        git rm test.txt,git commit -m "remove test.txt" 从版本库中删除该文件,并提交

        假设工作区开始就删错了,可以用版本库的覆盖工作区的

        git checkout -- test.txt

四、远程仓库
1、连上远程库

        git remote add origin git@github.com:wuhuaguo2/learngit.git  

2、本地向远程推送内容

        1、git push  -u origin master 第一次把本地库的master分支所有内容推送到远程库的master分支上

        2、git push  origin master 非第一次把本地库的master分支所有内容推送到远程库的master分支上

        3、git push  origin dev 非第一次把本地库的dev分支所有内容推送到远程库的master分支上

        4、远程库的名字就是origin

3、远程库的所有内容推送到本地库上

        git clone git@github.com:wuhuaguo2/gitskills.git  (第一次)

        或者:git clone http://github.com/wuhuaguo2/gitskills,但是接下来得输入账号密码

如果想拉指定分支如dev,先在本地:

        git checkout -b dev

        然后,git clone -b dev git@github.com:wuhuaguo2/gitskills.git

        或者: git clone -b dev http://github.com/wuhuaguo2/gitskills

第二次及以上

        git pull命令用于从另一个存储库或本地分支获取并集成(整合)。

        git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。 

        git pull = git fetch + git merge

如果gitlab上a提交了,b又提交了,现在a在本地修改了代码,准备提交
        git add .

        git commit -m “a second tijiao” 

        git push origin master

如果此时出现merge conflict,去解决冲突,然后git add . git commit -m “conflict resolved”

        git push origin master

能push上去不能push上去

git add .

git commit -m “a second tijiao” 

git push origin master

git add .

git commit -m “a second tijiao” 

git pull origin master

git push origin master

五、分制管理
1、基础命令

        查看分支:git branch

        创建分支:git branch 分支名

        切换分支:git checkout 分支名

        创建+切换分支:git checkout -b 分支名

        合并某分支到当前分支:git merge 分支名

        删除分支:git branch -d 分支名

        删除未被合并的分支:git branch -D 分支名

2、解决冲突

feature分支和master分支各自修改readme.txt,在git merge feature提示冲突了

        1、git status看到2个分支对readme.txt的提交冲突了

或者  cat readme.txt会看到<<<,===,>>>标记出不同分支的冲突内容 

        2、修改冲突,add, commit

        3、git log --graph --pretty=oneline --abbrev-commit查看分支合并情况

        4、删除feature分支: git branch -d feature1

例1:现有分支dev,新建一个分支xf,xf的原始内容和dev一样,尽情玩xf

        git checkout -b xf

        git merge dev

例2:git checkout -b xf1 origin/dev

⚠️危险操作,将本地xf1分支和线上dev分支关联起来。一般而言,本地分支和线上分支名字保持一致。

3、分制管理策略(禁掉快进模式)

        合并分支时,如果可能,Git会用Fast forward(快进)模式,但这种模式下,删除分支后,会丢掉分支信息。如果要用--no-ff强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

        1、在dev分支上add, merge

        2、切到master分支

        3、用—no-ff来merge: git merge--no-ff -m "merge with no-ff" dev

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

        4、git log --graph --pretty=oneline --abbrev-commit查看分支合并情况

禁掉快进模式后:

4、BUG分支

在dev分支下开发,突然接到任务:去master下修复一个代号=102的bug,但此时dev上add了但未commit,咋办?

1、用stash可以把当前工作现场“储藏”起来: git stash

2、切到master分支,从master创建临时分支issue-101,修复bug

        git checkout master

        git checkout -b issue-101

        vim readme.txt

        git add readme.txt 

        git commit -m "fix bug 101"

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支

        git checkout master

        git merge --no-ff -m "merged bug fix 101" issue-101

        git branch -d issue-101

3、回到dev分支、恢复工作区,继续开发

        git checkout dev

        git status显示工作区是干净的,因为存在stash里面  git stash list查看储藏列表  

从储藏恢复到工作区,两种方式

用git stash apply恢复工作区,再用git stash drop来删除stash

用git stash pop,恢复的同时把stash内容也删了

git stash list:    再次查看,就看不到任何stash内容了

5、Feature分支

        开发一个新的feature,最好新建一个分支。

        删除未被合并的分支:git branch -D 分支名

6、多人协作

git remote   查看远程库的信息,默认为origin

git remote -v     显示更详细的信息  

        1、从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
        2、在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
        3、建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
        4、从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

六、忽略上传

git忽略对已入库文件的修改(https://my.oschina.net/zlLeaf/blog/197740) 

1、忽略上传
        .gitignore 或者excludes 只针对尚未提交到配置库的文件才起作用。而对于已经提交的文件是不起作用的。
由此可见,这两个文件的初衷是用于排除不希望上传入库的文件。像编译产生的临时文件等。

2、忽略更新上传
        有个文件,我们必须入库,大家一起共享,但是每个人本地的配置又是因自己本地的环境而异。想后续不再更新给文件的修改,使用下面的命令:
git update-index --assume-unchanged FILENAME
这样,每个人,从库上取代码后,在自己本地都要执行一下上面的这个命令。这样,以后,你这个文件的修改,git 都会帮你忽略掉。
当然,哪一天,你希望你的修改要提交入库,那你也必须手动修改一下 这个文件的标志位:
        git update-index --no-assume-unchanged FILENAME

七、文件对比

git对比2个版本某个文件的差异
git diff                                          //查看尚未暂存的文件更新了哪些部分
git diff filename                      //查看尚未暂存的某个文件更新了哪些
git diff –cached                              //查看已经暂存起来的文件和上次提交的版本之间的差异
git diff –cached filename                   //查看已经暂存起来的某个文件和上次提交的版本之间的差异
git diff commit_id1 commit_id2                    //查看某两个版本之间的差异
git diff commit_id1 commit_id2 具体文件路径  //查看某两个版本的某个文件之间的差异,红色部分是commit_id1,绿色部分是commit_id2
(或者: git diff commit_id1:具体文件路径 commit_id2:具体文件路径)

git对比2个分支某个文件的差异
git diff branch1 branch2 --stat       //显示出所有有差异的文件列表
git diff branch1 branch2              //显示出所有有差异的文件的详细差异
git diff branch1 branch2 具体文件路径   //显示指定文件的详细差异,红色部分是commit_id1,绿色部分是commit_id2
(或者: git diff branch1:具体文件路径 branch2:具体文件路径)

八、高频操作
1、分支创建

(1)用某个commit新建分支:git checkout -b 分支名 commit_id
(2)用远程分支新建分支:git fetch origin 远程分支名:本地分支名
用远程分支新建分支:git fetch origin 远程分支名:本地分支名,然后,git checkout 本地分支名

2、更改commit的备注

详见:Git 修改已提交的commit注释 - 简书

(1)只想修改最后一次注释: git commit --amend
出现有注释的界面(你的注释应该显示在第一行), 输入i进入修改模式,修改好注释后,按Esc键 退出编辑模式,输入:wq保存并退出。ok,修改完成。

(2)修改之前的注释
(2.1)git rebase -i HEAD~10 
(2.2)想修改的那条注释前的 pick换成edit
(2.3)git commit --amend
(2.4)git rebase --continue

3、版本回退

比如commit提交最新到最旧为: D C B A 

(1)回退到B,CD不要了,===>版本回退:git reset --hard B
(2)撤销B的提交,其余保留, ===>版本撤销:git revert B
(3)取消对b提交的撤销,B重新回来, ===>git cherry-pick B

4、IDE上不同分支代码对比

--->全选,选择差异----> 

文章摘自 常用git命令总结大全_git 命令-CSDN博客 ,非本博主原创,学习过程中摘录加深印象!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值