Git常用命令总结

891 阅读13分钟

1、Git是什么?与SVN的区别在哪里?

区别 Git SVN
定义 Git是分布式版本控制系统。没有中央服务器,每个人电脑上都是一个完整的版本库。 SVN是集中式版本控制系统,版本库是集中放在中央服务器的,干活的时候先从中央服务器得到最新的代码,干完活你再把自己的代码推送到中央服务器
是否联网 Git只有在pull和push等操作的时候才需要联网。 SVN只有在联网的情况下才能工作。
版本记录 Git在断网的情况下,可以在本地保存版本记录。所以合并起来很方便。同时可以在没网的情况下查看开发的版本历史。 在断网的情况下,SVN不工作,既不能提交也不能回滚,所以也不会有本地记录。
历史库的存放位置 Git本地仓库包含代码库和历史库,在本地的开发环境中就可以记录历史。 SVN的历史库存在中央仓库,每次对比和提交代码都必须连接到中央仓库才行

Git和SVN的最根本区别在于历史版本维护的问题。

2、Git仓库

1、 创建git仓库的方案
    1 、第一种方案:在现有目录下初始化仓库
        1)创建一个文件夹
            mkdir vue
        2)在该文件夹下新建仓库
            git init  
            //此时vue目录下会出现一个.git的目录,该目录是用来跟踪管理版本的
    2、第二种方案:克隆现有的仓库
        git clone git@github.com:tangjie1111/vue.git
2、将本地仓库跟远程库关联起来(在本地仓库文件夹下(vue)输入下面的命名)
    1、第一步,在GitHub上面新建一个空的仓库
        Create a new repo 
        //然后在Repository name填入vue,此时可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联。然后把本地仓库的内容推送到GitHub仓库,
    2、第二步,将GitHub上的仓库关联到本地
        git remote add origin git@github.com:tangjie1111/vue.git 
        //git@github.com:tangjie-93/vue.git是仓库地址,tangjie1111是该用户吧账号名。 origin表示仓库的名称

        //关联多个远程仓库
        git remote add github git@github.com:tangjie-93/learngit.git 
        //关联github账户为tangjie-93,名为github的远程仓库
        git remote add gitee git@github.com:james/learngit.git
        //关联github账户为james,名为github的远程仓库
3、将远程仓库的内容拉取到本地且和本地分支合并
        git pull origin master
4、将远程仓库的内容拉取到本地
        git fetch [remote-name]
        //访问远程仓库,从中拉取所有你还没有的数据
5、将当前分支内容推送到远程分支
    git push [remote-name] [branch-name]
    git push -u origin master
    //将本地库的所有内容推送到远程库。将当前分支master推送到远程。参数u使得Git不但会吧本地的master分支内容推送到远程的master分支,还会把本地的master分支和远程的master分支关联起来。在以后的推送和拉取就可以简话化命令了。之后的推送就可以不用加u了。
    git push origin dev 或者git push origin dev:dev 
    //表示将当前分支推送到dev远程分支。origin是默认仓库名称,也可以使用其他名称
    git push origin dev:test
    //将本地的dev分支内容推送到远程仓库上的test分支

6、查看远程仓库的名称
    git remote 
    //查看远程仓库的名称
    git remote -v
    //查看远程仓库的信息
    git remote show [remote-name]
    //查看某一个远程仓库的更多信息
7、取消本地目录下关联的远程库
    git remote rm origin
    //删除已有的远程仓库
8、重命名远程仓库
    git remote rename dev test
9、重命名本地库
    git branch -m current-branch-name new-branch-name
10、在本地新建一个分支来跟踪远程分支
    git checkout -b serverfix origin/serverfix
    git checkout -b sf origin/serverfix 
    //将本地分支的名字改为sf
    git checkout --track origin/serverfix
11、设置已有的本地分支跟踪一个刚刚拉取下来的远程分支
    git branch -u origin/serverfix
12、将所有的本地分支列出来并且包含更多的信息
    git branch -vv 
    //一般要先将服务器上的数据线拉取过来 git fetch --all
13、删除一个远程分支
    git push origin --delete serverfix

3、Git设置配置项

    //对这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和邮箱
1、配置名字
    git config --global user.name "james";
2、配置邮箱
    git config --global user.email "14232134576.@qq.com";
3、查看配置列表
    git config --list 
4、查看某一配置项
    git config user.name
5、查看git有哪些命令
    git help 
    git help config //获取config命令的手册
6、配置git命令别名
    git config --global alias.status st
    git config --global alias.co checkout
    git config --global alias.br branch
    git config --global alias.ci commit
    git config --global alias.unstage 'reset HEAD --'
    git config --global alias.last 'log -1 HEAD'

4、版本回退

1、查看最近到最远的提交日志
    git log 
    //查看提交历史,以便确定要回退到哪个版本
    git log --pretty=oneline --abbrev-commit
    //仅仅显示版本号和提交说明 --pretty=oneline表示将提交历史放在一行显示 --abbrev-commit在于缩短commit id。
    git log --pretty=format:"%h - %an, %ar: %s" 
    //定制化要显示的记录格式

    git log --graph --pretty=oneline --abbrev-commit 
    //以图的形式展示提交信息合合并信息
2、将当前版本回退到上一个版本
    git reset --hard HEAD^ //HEAD指向当前版本
3、回退到指定版本
    git reset --hard 1092a //1092a表示版本号的前几位
    git reset HEAD "文件" //把暂存区的修改撤销掉
4、查看记录的每一次命令
    git reflog //查看命令历史,以便要回到未来的哪个版本
5、查看最近几次提交的内容差异
    git log - p -n
    //-p表示按补丁格式显示每个更新之间的差异
6、查看每次提交的简略的统计信息
    git log --stat
7、限制输出长度
    git log --since=2.weeks
    //查看最近两周的提交
    git log --pretty="%h - %s" --author=tangjie-93 --since="2008-10-01"
    //查看指定作者指定时间段的提交
8、按指定关键字进行筛选
    git log -Sgit
    //按git关键字筛选提交的内容
9、查看最后一次的提交记录
    git log -1
10、查看提交历史、各个分支的指向以及项目的分支分叉情况
    git log --oneline --decorate --graph --all
11、查看某个文件的修改记录
    git blame 文件名 -L//参数L来检查需要修改的某几行。
12、查看之前提交的内容
    git show commitId
    

1、下图是--pretty=format常用选项

2、下面是git log的常用选项

3、下图是限制git log输出的选项

5、工作区和暂存区

  • 工作区: 在电脑里能看到的目录,如vue文件夹就是一个工作区。
  • 版本库: 工作区的隐藏目录.git。
  • 暂存区: 版本库中存放的stage(或者叫index)的区域,以及Git为我们自动创建的第一个分支(master),以及指向master的一个指针HEAD。
1、将工作区的文件添加到暂存区
    git add "文件或者目录" 
    //实际上是把工作区的文件添加到暂存区;或者跟踪(track)新添加的文件;同时还能用于合并时将有冲突的文件标记为已解决状态。该命令可被理解为"添加内容到下一次提交中"
    注意: 执行git add的文件,还没执行git commit的文件,再次被修改后,需要重新执行git add命令才行。
    git commit -m "描述" 
    //把暂存区的所有内容提交到当前分支。
    //注意:提交记录的是放在暂存区的快照。
2、 将暂存区的文件提交到当前分支
    git commit -a -m "描述" 
    //把已经跟踪过的文件暂存起来一起提交。
    git commit --amend
    //用于修改提交内容
3、查看工作区文件的当前状态
    git status //查看工作区的当前状态
    git status -s 或者 git status --short//将当前工作区的转态信息简化
4、查看工作区文件和暂存区文件的差异(查看未暂存文件的修改)
    git diff //比较当前工作目录中当前文件和暂存区文件之间的差异。
5、查看暂存区文件和当前分支文件的区别(查看已暂存的文的修改)
    git diff --cached git diff --staged  //查看提交到暂存区但还没提交到分支的内容。也就是比较暂存区和仓库分支里的区别。 
6、查看工作区文件和当前分支最新版本文件的区别
    git diff HEAD -- "文件" //查看工作区和版本库里最新版本的某个文件的区别

6、撤销修改

1、将文件在工作区的修改全撤销
    git checkout -- "文件" 
    //把文件在工作区的修改全撤销。总之就是让这个文件回到最近一次git commit或 git add的状态。分两种情况讨论:
    //情况1,文件自修改后还没有放到暂存区,撤销修改后就回到和版本库一样的状态。如果此时你想把刚刚撤销的内容复原的话,如果此时的编辑器还没关掉的话,使用撤销"CTRL+Z"可以回到撤销之前的状态。
    //情况2,文件已经添加到暂存区,现在又做了修改,撤销修改就回到添加到暂存区后的状态。

    git checkout -- "文件" 中的--很重要,没有--,就变成了`切换到另一个分支`的命令。
2、将暂存区的修改撤销掉,就是撤销执行了add命令还没有执行commit命令的文件
    git reset HEAD "文件" 
    //将暂存区的修改撤销掉。使得工作区中文件与当前分支文件一样。

7、删除文件

1、将文件从暂存区中删除,分为以下两步。先删除,再提交
    git rm "文件" //从暂存区中删除该文件,并且会连带从工作目录中删除指定的文件
    git commit -m "delete file" //

    git checkout -- "文件" //用版本库里的文件替换工作区的版本,无论是修改还是删除。
2、如果删除之前修改过并且已经放到暂存区的话,就必须用强制删除选项-f 。用于防止误删还没有添加到快照区域的数据。
    git rm  -f "文件" 
3、删除git仓库中的数据,但文件仍然保留在磁盘中。
    git rm --cached "文件"

8、分支管理

1、创建和合并

  每次提交,Git都把它们串成一条时间线,该时间线就是分支。master称为主分支,master(分支)是指向提交对象的可变指针,HEAD指向的是当前分支。每次像maste分支r提交,master分支都会向前移动一步,提交的越多,master分支的线就越来越长。   当我们创建新的分支dev时,把HEAD指向当前分支dev。此时对工作区的修改和提交就是针对dev分支了,提交一次,dev分支的指针就向前移动一步,而master指针不变。。

1、创建分支
    git checkout -b dev 或者 git switch -c dev
    //相当于下面的两条执行语句
    git branch dev //创建分支
    git checkout dev //切换回当分支
2、查看当前分支
    git branch //会列出当前所有分支,且当前分支会标记一个`*`号
    git branch -a //查看本地和远程仓库的所有分支
3、切换分支
    git checkout dev或者 git switch dev
4、合并分支
    git merge dev //合并某分支到当前分支
5、删除分支
    git branch -d dev
6、强行删除分支
    git branch -D dev
7、创建远程分支到本地
    git checkout -b dev origin/dev
9、将本地分支推送到远程并在远程创建相同的分支
    git push origin dev:dev
10、删除远程分支
    git push origin :dev //origin 是远程仓库的默认名称
11、查看每个分支的最后一次提交
    git branch -v
12、查看已经合并到当前分支的分支
    git branch --merged

13、查看尚未合并到当前分支的分支
    git branch --no-merged

  创建当前分支(如下图所示)

  在当前当前分支提交,时间线的变化(如下图所示)

2、解决冲突

git log --graph --pretty=oneline //查看分支的合并情况

1、切换到dev分支,修个文件
    vi test.md
    git add test.md
    git commit -m "modify test.md"
    git switch master
    git merge dev//合并分支,冲突了
2、解决冲突
    vi test.md
    git add "test.md"
    git commit -m "modify .test.md" //此时自动合并了,此时当前分支上的数据是最新的,如果想在其他分支上也更新数据,可以在其他分支上git merge "其他分支"使得数据最新

3、通常在合并分支时,Git默认采用的是`Fast Forwar`模式,但是在这种模式下,删除分支后,会丢掉分支信息。
    git merge --no-ff -m "merge with no-ff" dev //表示禁用Fast Formard的方式,`的模式会记录分支历史。 -m 是因为本次合并会创建一个新的提交。`no-ff

3、bug分支   

    git stash 
    //将当前工作现场存起来,暂存没法提交的工作现场
    git stash list 
    //查看存储的列表
    git stash apply stash@{0} 
    //恢复指定的stash,但是stash的内容并没有删除
    git stash drop 
    //删除stash
    git stash pop 
    //恢复stash的同时也把stash删除了
    git cherry-pick commitid 
    //复制一个特定的提交到当前分支
    git checkout -b branch-name origin/branch-name 
    //在本地创建和远程分支对应的分支,名称最好一样
    git branch --set-upstream branch-name origin/branch-name
    //建立本地分支和远程分支的关联
    git rebase 
    //将原本分叉的提交历史变成一条直线。本质上就是把本地未push的分叉提交历史整理成直线。 使得我们在看历史提交的变化更容易些。其实就是把我们本地的提交放到了别人提交之后了。不足的是本地的分支提交已经被修改过了。

9、标签管理

  标签是版本库的快照,是指向某个commit的指针。目的在于可以让人们更快的记住。

1、创建标签
    git tag "标签名" //默认是对最新的commit 设置标签
    git tag "标签名" commitid //对特定commit设置标签
2、后期打标签
    git tag -a <tagname> -m "blablabla..." commitid 
    //指定标签信息 commitid表示版本id
2、查看所有标签
    git tag
    
    git show "标签名"
    //查看该标签的详细信息
3、附注标签
    git tag -a <tagname> -m "blablabla..."
    //-a表示指定标签名 -m表示指定说明文字
4、删除标签
    git tag -d "标签名"
    tit push origin :refs/tags/"标签名"//可以删除一个远程标签
5、推送标签
    git push origin "标签名" 
    //推送一个本地标签到远程仓库
    git push origin --tags 
    //推送全部未推送过的本地标签到远程