美文网首页
git常用命令

git常用命令

作者: Sixah | 来源:发表于2018-10-06 16:53 被阅读0次

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

  • 工作区(Working Directory)

就是你在电脑里能看到的目录

  • 版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

  • git init

在当前目录下创建一个空的git仓库

  • git add

添加一个文件到仓库
例如,此时目录下有一个hello.txt格式的文件,要添加这个文件到仓库,命令为git add hello.txt
如果目录下有多个文件,都要添加到仓库的话,命令为git add .
这个[.]点符号,就是代表全选的意思

  • git commit

将之前添加到仓库的文件提交到仓库
命令后面可以加参数-m 是对这次提交的注释,例如git commit -m "首次提交"
还有一种用法,就是不使用git add 添加文件到仓库,直接使用git commit -a -m "首次提交"
这个命令就是直接提交你改动过的文件到仓库

  • git cherry-pick

命令git cherry-pick [commit ID]合并某个分支上的某个提交,操作对象是一个commit提交,首先查询到要合并commit提交的commit ID,然后执行前面的命令,如果没有代码冲突,合并到这里就结束了。如果有代码冲突,解决代码冲突,然后继续执行命令

git add .
git cherry-pick --continue
git push

解决冲突之后,git add .把合并过来的修改添加到仓库中,然后git cherry-pick --continue继续执行之前的合并操作,至此合并完成,就可以git push提交到远程仓库了。

  • git status

查看仓库当前的状态。 命令git status

  • git diff

difference的所写,顾名思义,就是查看差异的,可以查看文件的改动内容。命令git diff
命令git diff HEAD -- hello.txt可以查看工作区和版本库里面最新版本的区别

  • git reset

  1. 回退提交版本,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100,命令git reset [options] HEAD^ options参数有两个--soft保留当前回退版本之后的工作区修改 --hard 撤销当前回退版本之后的工作区修改(谨慎使用)
    最新的那个版本已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
    办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个commit id,于是就可以指定回到未来的某个版本: git reset --soft [commit id]
    如果是误提交且已经推送到了远程,现在要回退到某个提交版本,误提交的版本不再需要了,完成的操作流程如下:
    <1>. git log查看提交记录,找到正确版本的commit id
    <2>. git reset --soft [commit id]回退版本, 使用--soft保留修改比较稳妥
    <3>. git push origin [分支名] --force强制提交当前版本为最新版本
    此时,暂存区内还保留着上次误提交的修改记录,如果修改或删除,再使用git reset HERD [filename]撤销暂存,接下来就可以按需修改了。
  2. 如果已经git add提交到了暂存区,但是还没有git commit提交到分支,就可以使用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区,这样暂存区就是干净的了,工作区里有修改
    命令git reset HEAD -- <filename>
  3. 现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。
  • git log

显示从最近到最远的提交日志
如过信息输出太多不好看的话,可以加上--pretty=oneline参数简化输出信息。
命令git log --pretty=oneline
命令git log --graph可以看到分支合并图
命令git log -p可以查看每次提交的更改内容

  • git reflog

如果在回退版本以后又想再次回到之前的版本,git reflog可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录

  • git checkout

命令git checkout -- hello.txt意思就是,把hello.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是hello.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是hello.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令
git checkout sixah origin/sixah 创建本地分支sixah,映射远程分支origin/sixah

  • git rm

命令git rm用于删除一个文件。假如你在工作区误删了一个文件,如果这个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
如果版本库中也不需要删除的那个文件的话,使用git rm命令就可以删掉这个文件了
命令git rm -r --cache [directory]删除远程仓库中已经提交的目录,执行完命令,记得commit一次提交

  • git remote

命令git remote add origin <远程仓库地址>关联远程仓库,这样就可以把本地仓库的文件同步到远程仓库
origin是远程仓库的名字,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库
命令git remote -v查看当前本地的Git仓库关联的远程仓库信息
命令git remote remove <远程仓库名>删除关联的远程仓库

  • git push

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。命令git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push --set-upstream origin master如果是第一次提交,需要设置提交和追踪的分支

  • git config credential.helper store

如果是http的远程仓库地址,也没有添加git密钥,每次提交都会让你输入你的git用户名和密码,当你输入过一次用户名和密码后,输入这个命令,git就会自动保存你的用户名和密码,下次再提交的时候,就不需要输入用户名和密码了

  • git clone

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。命令git clone <远程仓库地址>
然后就会在本地当前目录下,创建一个本地库

  • git branch

git branch命令会列出所有分支,当前分支前面会标一个*
git branch <name>创建分支
git checkout <name>切换分支
git checkout -b <name>创建+切换分支
git branch -d <name>删除分支
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

  • git merge

git merge <name>命令用于合并指定分支到当前分支。默认为fast forward快速合并模式
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。命令git merge --no-ff -m "merge with no-ff" dev
请注意--no-ff参数,表示禁用Fast forward

  • git stash

git stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash list命令可以查看存储起来的工作现场
Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
比如模拟场景。修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

  • git pull

从远程抓取分支,使用git pull

  • git rebase

git rebase操作可以把本地未push的分叉提交历史整理成直线
git rebase -i修改提交历史信息,运行命令后,会进入交互式界面,如下所示

pick 5e187c7dbe8    add center style indent
pick 6d577eb3440    add center style
pick f9b9508a3ab    add center style
pick 111ab9cc261    update templates
# Rebase 150a643..2fad1ae onto 150a643
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

如果我们需要合并历史的话,可以修改pick 为fixup,代表把当前提交信息合并到上一次的提交

pick 5e187c7dbe8    add center style indent
fixup 6d577eb3440   add center style
fixup f9b9508a3ab   add center style
fixup 111ab9cc261   update templates
# Rebase 150a643..2fad1ae onto 150a643
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

这样就把最近的三次提交都合并到了第一次提交里面

  • git tag

命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id
命令git tag -a <tagname> -m "blablabla..."可以指定标签信息
命令git tag可以查看所有标签
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

  • 配置别名

有没有经常敲错命令?比如git statusstatus这个单词真心不好记。
如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。
我们只需要敲一行命令,告诉Git,以后st就表示status

$ git config --global alias.st status

好了,现在敲git st看看效果。
当然还有别的命令可以简写,很多人都用co表示checkoutci表示commitbr表示branch

$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch

以后提交就可以简写成:

$ git ci -m "bala bala bala..."

--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用

  • 参考文档

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000#0

相关文章

网友评论

      本文标题:git常用命令

      本文链接:https://www.haomeiwen.com/subject/ruthaftx.html