git常用命令

本文参考内容主要有:
1. https://gitee.com/all-about-git gitee
2. https://www.liaoxuefeng.com/wiki/896043488029600  来自廖雪峰老师的git教程


一、在看命令之前先来了解下git的工作原理 / 流程:

Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
HEAD指向的版本就是当前版本;

二、git配置相关

1. 查看配置

  (1) 在当前项目下面查看的配置是 全局配置 + 当前项目配置 , 使用时优先使用前项目配置;

  $  git config --list

  (2) 查看全局配置

  $ git config --global --list

2. 设置全局用户名和邮箱

  $ git config --global user.name "Your Name"

  $ git config --global user.email "email@example.com"

注意:git config命令的--global参数,用了这个参数,表示你这台机器上所有的
Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

3. 配置单个仓库的用户名、邮箱,如果你不进行配置用户名和邮箱的话, 则会使用全局的。在当前项目下执行:

  $ git config  user.name "yourUserName"

  $ git config  user.email "github@xx.com"

三、版本库的创建、提交等基本操作

 1. 创建版本库

    $ git init

2. 将文件从工作区增加都index/stage(索引区/暂存区)

  (1) 不带参数多个文件用空格隔开

    $ git add [feile]

  (2) 注意其中小数点,这条命令可以探测到新增、修改、删除,比较常用;

  $ git add . 

  (3) 更新你已经跟踪的文件,其中u代表updata。如果添加了新文件,那么是不会主动跟踪的。

    $ git add -u .

  (4) git add -A .  包括了前两项

注意:将修改的文件add到暂存区后但是没提交到本地仓库,这时我又修改了工作区的该文件,
如果我需要将刚才修改的工作区的文件提交到本地仓库的话,那么我必须对该文件再次add到暂存区
即:每次修改,如果不用git add到暂存区,那就不会加入到commit中。

  3. 将文件提交到本地版本库,其中-m后面输入的是本次提交的说明;

    git commit -m "注释信息"

 4.  将文件从暂存区移除,即从index/stage(暂存区)移除;

    (1) 移除某个文件,多个文件时用逗号隔开;

      $ git reset HEAD <file>

    (2) 移除暂存区的所有文件;

      $ git reset HEAD .

注意:将修改的文件add到暂存区后但是没提交到本地仓库,这时我又修改了工作区的该文件,
如果我需要将刚才修改的工作区的文件提交到本地仓库的话,那么我必须对该文件再次add到暂存区
即:每次修改,如果不用git add到暂存区,那就不会加入到commit中。

5. 更新 git pull

git pull = git fetch + git merge

6. git ftch -p 修剪本地分支

https://blog.csdn.net/LJFPHP/article/details/81741931

7、git fetch -a 获取远程仓库的所有分支更新,并把它们存放在本地的 fetch 目录下

  具体来说,git fetch 命令用于从远程仓库获取最新的版本信息,而 -a 参数表示获取所有分支的更新。这个命令不会自动合并或更新任何本地分支,

它只是把远程仓库的所有更新下载到本地的 fetch 目录下。

四、git提交历史的查看

   1. 查看提交历史,显示从最近到最远的提交日志

      $ git log    

        commit 98bf5780459729112ff2c1a9f3bc420f3f9f84ea (HEAD -> master)
        Author: “这里是显示的是提交人信息
        Date: Sun Jun 7 18:31:25 2020 +0800  

解读:其中98bf5780459729112ff2c1a9f3bc420f3f9f84ea,是commit的版本号,和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到
的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为
Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作
为版本号,那肯定就冲突了。每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可
视化工具查看Git历史,就可以更清楚地看到提交历史的时间线。

    2. 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

     $ git log --pretty=oneline

   3. 带参数的git log也可以看到分支的合并情况:(git log --graph命令可以看到分支合并图)

$ git log --graph --pretty=oneline --abbrev-commit
* cf810e4 (HEAD -> master) conflict fixed
|\ 
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/ 
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append GPL
* e475afc add distributed
* eaadf4e wrote a readme file

   4. 查看命令历史

     $ git reflog

五、git差异化比较

  1. 暂存区和工作区的比较

    $ git diff 

    注意:比较的是当前分支的内容,输出的内容和参考博客:https://blog.csdn.net/weixin_37909391/article/details/84641899.

  2. 比较暂存区和最近一次commit的差异

    $ git diff --cached [file] 或者 git diff --staged [file]

  3. 显示工作区与当前分支最新commit之间的差异

    $ git diff HEAD

  4. 显示两个分支之间的差异

    $ git diff [first-branch]...[second-branch]

    两个分支的差异,只显示名称和路径

    $ git diff --name-only --ignore-space-change --ignore-all-space [origin/] 分支名 [origin/] 分支名

  5. 查看工作区与本地远程仓库副本的差异,注意比较内容是以本地工作区为基准

    $ git diff FETCH_HEAD

  6. 显示今天你写了多少行代码

    $ git diff --shortstat "@{0 day ago}"

  7. 显示两次提交之间的差异,如果加上 --name-only,只显示名称和路径

  $ git diff [first-branch]...[second-branch] --name-only

六、 git reset、git revert 相关的使用

(1) git reset 的使用

1.  $ git reset HEAD [file]

    回退到当前版本,也就是去除掉添加到暂存区的内容,因此git reset HEAD
    操作只对暂存区起效果,多文件时可以$ git reset HEAD .(注意有个小数点)。

 2. git reset commitNo(版本号)或者

    回退到指定的版本号,这两个不加soft默认为soft,不影响工作区的;

  3. git reset --hard commitNo

    版本回退,直接把工作区的内容也修改了,慎用。需要注意的是使用版本回退后,git log是看不出
    你回退到版本号之前的记录的,但你可以使用git reflog查看命令历史。

 4.  git reset --hard HEAD^,回退到上一个版本(即回退最近一次提交的内容);或者 git reset --hard HEAD^2,回到最近第二次提交的内容;

 5. git reset [--soft] HEAD^,回退到最近一次提交;或者 git reset [--soft]  HEAD^2,回到最近的第二次提交;

(2)git revert的使用 

1. git revert commitNo

   这条命令会把指定的提交的所有修改回滚,并同时生成一个新的提交。

2. git revert --no-commit commitNo,撤销commitNo的提交,但不提交,可以最后手动进行提交;

3. git revert --no-commit commitNo1..commitNo1,撤销commitNo和commitNo区间的提交(前开后闭),

 但不提交,可以最后手动进行提交

注意:git revert时可能会出现冲突,这是需要手动解决后提交;

区别:git reset撤销时会清除之前的提交记录,而git revert不会清除原有的提交记录;

七、git checkout 的使用  $ git checkout -- file,文件在工作区的修改全部撤销,注意其中的 -- 很重要,没有 --,就变成了"切换到另一个分支"的命令;

  场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,
    用命令git checkout -- file。
  场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命
    令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
  场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,可参考版本回退,不过前提是没有推
    送到远程库。

八、远程仓库的关联、推送

  1. 本地仓库与远程仓库关联,即关联一个远程库;

    $ git remote add origin git@github.com:git用户名/远程仓库地址(或者使用ssh方式)
  2. 向远程推送分支内容
    $ git push -u origin master

注意:由于第一次的时候远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支
内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉
取时就可以简化命令,直接使用 git push就行了。
3. 从远程仓库克隆

  $ git clone git@github.com:michaelliao/gitskills.git

九、分支管理
  1. 创建分支
    $ git branch newBranch,创建一个新分支newBranch
    $ git checkout -b newBranch,创建并切换到分支newBranch
    $ git switch -c newBranch,创建并切换到分支newBranch,这是个比较新的用法;
  2.  本地分支和远程分支建立关系,最好本地分支和远程分支名称保持一致,如下;

      * 查看本地分支与远程分支的映射关系:$ git branch -vv

      * 撤销指定分支与远程分支的映射关系:$ git branch --unset-upstream [分支名]

       * 撤销当前本地分支与远程分支的映射关系:$ git branch --unset-upstream

    方式1:在本地创建和远程分支对应的分支:

    $ git checkout -b branch-name origin/branch-name

   方式2:建立本地分支和远程分支的关联:
    $ git branch --set-upstream-to=origin/remoteBranch【远程分支名称】 remoteBranch【本地分支名称】

   方式3:建立本地分支和远程分支的关联:
    $ git push -u origin 远程分支名称

git push -u origin master 
相当于
git push origin master
加
// 将远程仓库origin的master分支与本地仓库master分支关联
git branch --set-upstream-to=origin/master master

 

  3. 查看分支
    (1) git branch命令会列出本地仓库所有分支,当前分支前面会标一个*号,如下显示三个分支

  $ git branch,
     demo
     master
     * remoteBranch

    (2) 查看所有分支,包括本地分支和远程分支

     $ git branch -a
  4. 切换分支
   $ git checkout branchName,切换到分支branchName,注意撤销修改是git checkout -- file
   $ git switch branchName,切换到分支branchName
  5. 合并分支
    (1)$ git merge <branchName>,合并指定分支(branchName)到当前分支;
    (2)合并分支的模式:Fast forward,no-ff,squash,rebase详情见:

      git merge和git merge --no-ff的区别

    如:$ git merge --no-ff -m "描述内容" branchName;关闭fast-forward模式
  6. 删除分支
    $ git branch -d branchName,删除分支;
    $ git branch -D branchName,强制删除分支;

   7. 修改分支名称

    $ git branch -m oldName newName;

git命令:
1. cherry-pick命令,让我们能复制一个特定的提交到当前分支:
常见问题:
1. git pull 时Please enter a commit message to explain why this
译文:请输入提交消息来解释为什么这种合并是必要的
解决方式:
git 在pull或者合并分支的时候有时会遇到这个界面。可以不管(直接下面3,4步),如果要输入解释的话就需要:
(1).按键盘字母 i 进入insert模式;
(2).修改最上面那行黄色合并信息,可以不修改;
(3).按键盘左上角"Esc";
(4).输入":wq",注意是冒号 + wq,按回车键即可.

其它:

1. git bash终端中,git commit、git status 乱码问题

https://zhuanlan.zhihu.com/p/357002483

https://zhuanlan.zhihu.com/p/452682481

posted @ 2020-06-07 23:37  达摩院的BLOG  阅读(318)  评论(0编辑  收藏  举报