Git 命令分析

常用命令介绍

下面这张图是git完整的代码提交等操作流程图

  • workspace  本地工作区,idea中我们的代码
  • staging area 暂存区
  • local repository 本地仓库(本地分支)
  • remote repository 远程仓库(远程分支)

1. git init 

  • git init 命令用来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行。Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变

2.git config

  • git config 配置git变量
git config --global  user.name "xxxxx" //配置name
git config --global  user.email "xxxxx"//配置邮箱
#查看
git config user.name
git config user.email
  •  git config --list 查看所有的属性

3. git add

  • git add 提交代码到暂存区(Index)
  1. 可以用它开始跟踪新文件,并放到暂存区,新建的文件尚未加到git的追踪中,需要使用git add 文件名来追踪
  2. 或者把已跟踪的被修改的文件放到暂存区
//一个
git add name
//所有
git add .

4. git commit 

  • git commit 提交代码到本地分支(local reository)
  1. git commit  -m "注释"                  #一次提交多个文件
  2. git commit  name  -m "注释"        #一次提交一个文件 
$ git commit -m "提交readme文件"
[master (root-commit) eb8683b] 提交readme文件
 1 file changed, 3 insertions(+)
 create mode 100644 README

提交后会返回当前是在哪个分支(master)提交的

  • $ git commit --amend 有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交:

例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

$ git commit -m 'initial commit' //这次commit发现有些需要补充
$ git add forgotten_file //补充后add
$ git commit --amend //追加到上次commit

最终你只会有一个提交——第二次提交将代替第一次提交的结果。

  • git commit -a -m "注释"    Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤,注意是已经跟踪过的,未跟踪的不可以

$ git commit -a -m "不add直接提交"
[master 60cc9af] 不add直接提交
 1 file changed, 2 insertions(+), 1 deletion(-)

5.git status检查当前文件状态  

  • git status 详细版
  • git status -s 简版

6.git diff 

比较文件的不同,即暂存区、工作区、本地分支之间的差异。

  • git diff <fileName>     比价暂存区和工作区的差异
  • git diff --cached <fileName>/ git diff --staged <fileName>  比较暂存区和HEAD的差异(比对已暂存文件与最后一次提交的文件差异)
  • git diff HEAD  <fileName> 比较工作区和HEAD的差异

其他:

  • git diff --stat 显示摘要而非整个 diff
  • git diff commit-id  <filename>.   比较工作区与指定的 commit -id 的差异
  • git diff --cached commit-id  filename. 比较暂存区与指定 commit-id 的差异
  • qgit diff commit-id commit-id比较两个 commit -id 的差异

7.git log 查看历史提交记录

  • git log -显示从最近到最远的提交日志,主要用于回退版本
  • git blame <file> -以列表形式查看指定文件的历史修改记录。

git log 查看日志

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

  • git log --pretty=oneline
  • git log --oneline

 --graph 查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项

  • git log --graph

  • git log --reverse 逆向显示所有日志
  • git log --author 查找指定用户的提交日志可以使用命令:例如,比方说我们要找 Git 源码中 name提交的部分,只要最近5条

git log --author=name --oneline -5

--since 和 --before,指定开始结束日期,结束你也可以用 --until 和 --after。

例如,如果我要看 Git 项目中三周前且在四月十八日之后的所有提交,我可以执行这个(我还用了 --no-merges 选项以隐藏合并提交):

  • git log --oneline --before={3.weeks.ago} --after={2021-04-18} --no-merges

 -p 或 --patch ,它会显示每次提交所引入的差异(按 补丁 的格式输出),你也可以限制显示的日志条目数量,例如使用 -2 选项来只显示最近的两次提交

git log -p -2

git log --stat 附带一系列的总结性选项,比如你想看到每次提交的简略统计信息,选项在每次提交的下面列出所有被修改过的文
件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了

git log 命令查看各个分支当前所指的对象。 提供这一功能的参数是 --decorate。
git log --oneline --decorate
git log --oneline --decorate --graph --all ,它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况

8. git reset 回退版本

在了解git reset之前,先了解一下正常提交代码的顺序

1.workspace 本地代码

2.index  暂存区

3.HEAD 上次提交的快照,或者叫Git 目录,Git仓库

本地工作区编写完代码后:用git add 命令把代----》提交到Index暂存区,然后使用 git commit 更新HEAD快照指针

在Git中,用HEAD表示当前版本,也就是最新的提交版本号是1094adb...(注意我的提交ID和你的肯定不一样),

上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

另外,git reset HEAD^ = git reset HEAD~  

gir reset 命令解析:

A :git reset --soft HEAD~                                            移动HEAD指向
B :git reset -–mixed HEAD~  == git reset HEAD~      回退暂存区
C :git reset --hard HEAD~                                          回退工作区

从Git目录回滚,例如:如果文件已经commit完成,进行回滚

  • git reset HEAD~   走AB     回退到暂存区
  • git reset --hard HEAD~  走ABC   回退到工作区

从暂存区回滚

1.如果我们有两个文件修改后同时加入到了暂存区,但是其中一个文件不想暂存提交,git reset HEAD fileName 可以使其回退到工作区

2.命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,(一定要看,回滚之前请保存或者提交代码。切勿在回滚的时候有未提交到分支的代码,会发生不可逆转的损失)这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;(上一次的git commit 后,修改readme.txt 但没有执行git add,回到上一次的git commit后的结果)

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。(修改readme.txt,并且git add,然后又修改了readme.txt, 此时执行git checkout,回到git add 后的状态)

总之,就是让这个文件回到最近一次git commitgit add时的状态。

回滚到指定版本号

git回退到上个版本

  • git reset --hard HEAD^

回退到前3次提交之前,以此类推,回退到n次提交之前

  • git reset --hard HEAD~3

回滚到指定的版本号

  • git log 找到指定的commit号
  • git reset --hard commit号   本地仓库和暂存区都回滚到commit号提交

版本号没必要写全,前几位就可以了,Git会自动去找。

注意加上--hard后,代码是直接撤销动,工作区也不保留

  • git reflog Git提供了一个命令git reflog用来记录你的每一次命令: git reflog

9.git rm  删除工作区文件

  • git rm FileName

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 “Changes not staged for commit” 部分(也就是未暂存清单),然后需要再次提交

  • git rm -f FileName

 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。

  •  git rm --cached FileName

如果我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可

  • git checkout HEAD^ -- test.txt  删除并提交以后的恢复

使用 git rm 删除了 test.txt 这个文件并提交了。接下来我们把它恢复过来,工作目录现在是干净的,使用 git checkout HEAD ,在 HEAD 的后面,可以加上一个向上的箭头,表示最近提交的上一次提交,两个箭头表示上两次提交,后面是两条横线,表示当前的分支,一个空格,接上是要恢复的文件的名称,使用命令 git checkout HEAD^ -- test.txt 。再使用 ls 列出目录里的文件test.txt 已经在工作目录里了

  • git checkout HEAD -- test.txt 删除未提交的恢复

执行 git rm -- test.txt  再使用命令 ls 查看一下目录,现在是空的,再查看一下状态 git status 这时会提示当前有一个要被提交的修改。如果我们改主意了,不想删除 MainActivity.java ,把它恢复过来,使用命令 git checkout HEAD -- test.txt  ,git checkout,后面加上一个 HEAD,表示最近一次提交,后面是两条横线,表示当前的分支,一个空格,接上是要恢复的文件的名称,意思就是把 MainActivity.java 这个文件恢复到最近一次提交的状态。再输入 ls 查看目录

如果删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本。

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

 注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

10.git mv 移动或重命名工作区文件

git mv 命令用于移动或重命名一个文件、目录或软连接。

  • git mv [file] [newfile]

如果新但文件名已经存在,但还是要重命名它,可以使用 -f 参数:

  • git mv -f [file] [newfile]

git mv file_from file_to  Git 中对文件改名
其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.mdv
$ git add README

11.忽略某些文件

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。 来看一个实际的 .gitignore 例子:

$cat .gitinnore
*.[oa]
*~

第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。
第二行告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。此外,你可能还需要忽略 logtmp 或者 pid 目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。

文件 .gitignore 的格式规范如下:

  • 所有空行或者以注释符号  开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)

我们再看一个 .gitignore 文件的例子:

# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录下所有扩展名为 txt 的文件
doc/**/*.txt

**\通配符从 Git 版本 1.8.2 以上已经可以使用。

12.远程仓库

由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:

使用以下命令生成 SSH Key:

$ ssh-keygen -t rsa -C "自己的邮箱"

后面的 自己的邮箱 改为你在 Github 上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。

成功的话会在 ~/ 下生成 .ssh 文件夹,进去,打开 id_rsa.pub(这个是公钥,对应的另一个文件id_rsa为私钥),复制里面的 key

回到 github 上,进入 Account => Settings(账户配置)。

左边选择 SSH and GPG keys,然后点击 New SSH key 按钮,title 设置标题,可以随便填,粘贴在你电脑上生成的 key。

添加成功后界面如下所示

为了验证是否成功,输入以下命令:

以上是针对自己的github远程仓库,对应公司的github也需要配置公钥

 git clone 克隆项目

git clone git://github.com/schacon/simplegit-progit.git

使用 git clone 从现有 Git 仓库中拷贝项目。行该命令后,会在当前目录下创建一个名为simplegit-progit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录

克隆仓库的命令格式为:

git clone <url>

如果我们需要克隆到指定的目录,可以使用以下命令格式:

git clone <url> <file>
参数说明:
    url:Git 仓库。
    file:本地目录。

添加远程仓库地址

  • git remote add origin url

查看当前的远程库

  • git remote

  • git remote -v

要查看当前配置有哪些远程仓库,可以用 git remote 命令,它会列出每个远程库的简短名字。在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库:

也可以加上 -v 选项(译注:此为 --verbose 的简写,取首字母),显示对应的克隆地址:

gu_xi@PC-GUXILONG MINGW64 /d/software/projectspace/ticgit (master)
$ git remote
origin

gu_xi@PC-GUXILONG MINGW64 /d/software/projectspace/ticgit (master)
$ git remote -v
origin  git://github.com/schacon/ticgit.git (fetch)
origin  git://github.com/schacon/ticgit.git (push)
  •  git remote show [remote-name] 

我们可以也通过命令 git remote show [remote-name] 查看某个远程仓库的详细信息,比如要看所克隆的 origin 仓库,可以运行:

$ git remote show origin
* remote origin
  URL: git://github.com/schacon/ticgit.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branches
    master
    ticgit

除了对应的克隆地址外,它还给出了许多额外的信息。它友善地告诉你如果是在 master 分支,就可以用 git pull 命令抓取数据合并到本地。另外还列出了所有处于跟踪状态中的远端分支。

上面的例子非常简单,而随着使用 Git 的深入,git remote show 给出的信息可能会像这样:

$ git remote show origin
* remote origin
  URL: git@github.com:defunkt/github.git
  Remote branch merged with 'git pull' while on branch issues
    issues
  Remote branch merged with 'git pull' while on branch master
    master
  New remote branches (next fetch will store in remotes/origin)
    caching
  Stale tracking branches (use 'git remote prune')
    libwalker
    walker2
  Tracked remote branches
    acl
    apiv2
    dashboard2
    issues
    master
    postgres
  Local branch pushed with 'git push'
    master:master

远程仓库的删除和重命名

  • git remote rename oldName newName

在新版 Git 中可以用 git remote rename 命令修改某个远程仓库在本地的简称,比如想把 pb 改成 paul,可以这么运行:

$ git remote rename pb paul
$ git remote
origin
paul

注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的 pb/master 分支现在成了 paul/master

碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库,可以运行 git remote rm 命令:

$ git remote rm paul
$ git remote
origin

13. 推送至远程仓库

  •  git push [remote-name] [branch-name]。如果要把本地的 master 分支推送到 origin 服务器上(再次说明下,克隆操作会自动使用默认的 master 和 origin 名字),可以运行下面的命令:

$ git push origin master

只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。

  • git push origin serverfix:serverfix, 它会做同样的事——也就是说“推送本地的 serverfix 分支,将其作为远程仓库的 serverfix 分支” 可以通过这种格式来推送本地分支到一个命名不相同的远程分支。 
    如果并不想让远程仓库上的分支叫做 serverfix,可以运行 git push origin serverfix:awesomebranch 来将本地的 serverfix 分支推送到远程仓库上的 awesomebranch 分支。

git push origin branchName 如果远程没有这个分支,会自动创建一个远程分支

  • git push -u origin master     -u的意思是默认把本地master和远程的master关联上去,下次就直接git push
  • git push -f origin master 强制推送
  • git push origin --delete serverfix 删除远程分支

14. 从远程仓库拉取数据(更新本地代码)

git pull = git fetch + git merge 尽量用git getch + git merge
  • git fetch  命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动git merge将其合并入你的工作,可以运行 git merge remoteName/branchName 
  • git fetch --all 所有的分支都拉取

而git pull拉取远程分之后直接与本地分支进行合并

git pull <远程主机名> <远程分支名>:<本地分支名>

例如执行下面语句:

git pull origin master:brantest
将远程主机origin的master分支拉取过来,与本地的brantest分支合并
  • git pull origin mastes

表示将远程origin主机的master分支拉取过来和本地的当前分支进行合并。

gu_xi@PC-GUXILONG MINGW64 /d/software/projectspace/e3mall (master)
$ git fetch
From https://github.com/guxilong/e3mall
   43e1185..fb72f7f  master     -> origin/master

gu_xi@PC-GUXILONG MINGW64 /d/software/projectspace/e3mall (master)
$ git merge
Updating 43e1185..fb72f7f
Fast-forward
 README.md | 1 +
 test1.txt | 1 +
 2 files changed, 2 insertions(+)
 create mode 100644 test1.txt

14.git 分支管理

  • git  branch <name>          创建分支
  • git branch                         查看本地分支
  • git branch -a                    查看所有分支
  • git branch -d <name>     删除分支
  • git branch -D <name>     强制删除某分支
  • git checkout <name> 或者git switch <name>  切换到name分支
  • git checkout -b <name> 或者git switch -c <name> 创建dev分支,然后切换到dev分支
  • git merge <name>          合并某分支到当前分支
  • git branch -v 查看每一个分支的最后一次提交
  • git checkout -b serverfix origin/serverfix 从远程origin/serverfix分支拉取一个分支到本地,名字为serverfix,并且起点位于 origin/serverfix。
  • git checkout --track origin/serverfix 这个是快捷操作,默认名字和远程一样

15.追踪

 

参考资料

https://git-scm.com/book/zh/v2

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值