当前位置:   article > 正文

常用git命令总结大全_git 命令

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)

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、本地向远程推送内容

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

五、分支管理

1、基础命令

2、解决冲突

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

4、BUG分支

5、Feature分支

6、多人协作

六、忽略上传

1、忽略上传

2、忽略更新上传

七、文件对比

八、高频操作

1、分支创建

(1)用某个commit新建分支:git checkout -b 分支名 commit_id

(2)用远程分支新建分支:git fetch origin 远程分支名:本地分支名

2、更改commit的备注

(1)只想修改最后一次注释: git commit --amend

(2)修改之前的注释

(2.1)git rebase -i HEAD~10 

(2.2)想修改的那条注释前的 pick换成edit

(2.3)git commit --amend

(2.4)git rebase --continue

3、版本回退

(1)回退到B,CD不要了,===>版本回退:git reset --hard B

(2)撤销B的提交,其余保留, ===>版本撤销:git revert B

(3)取消对b提交的撤销,B重新回来, ===>git cherry-pick B

4、IDE对比不同分支的


一、常用命令

1、git init

2、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、版本回退

(4.1)删除分支

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

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

(4.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 tag tagname (commit_id)git checkout -b branchname
git tag -a tagname -m "标签详情" (commit_id)
查看看当前git show tagname
看全部git taggit branch
推远程git push origin tagnamegit push origin branchname
删除删本地git tag -d tagnamegit branch -D branchname
删远程git push origin :refs/tags/tagnamegit push origin :branchname

三、删除文件

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、本地向远程推送内容

git push  -u origin master

第一次把本地库的master分支所有内容推送到远程库的master分支上

git push  origin master

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

git push  origin dev 

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

远程库的名字就是origin

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

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

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

如果想拉指定分支如dev,先在本地:git checkout -b dev

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

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

第二次及以上

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

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

git pull = git fetch + git merge

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

git commit -m “a second tijiao” 

git push origin master

此时肯定提交不上去,需要先pull下来(pull=fetch取远程+merge远程与本地合并)

git pull 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 分支名

//创建分支并上传线上
git checkout -b xf
git add routes/web.php
git commit -m “test”
git push origin xf

//查看分支,并pull下来
git fetch —all
git pull origin xf 

2、解决冲突

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

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

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

2、修改冲突,add, commit

3git 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下修复一个代号=102bug,但此时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     显示更详细的信息  

  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
  • 从远程抓取分支,使用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 - git-archive Documentation git 官方手册

10 个很有用的高级 Git 命令 - 技术翻译 - OSCHINA 社区 10个很有用的高级Git命令

git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚 - PianoCoder - 博客园 git删除本地分支和远程分支、本地代码回滚和远程代码库回滚

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/120202?site
推荐阅读
相关标签
  

闽ICP备14008679号