美文网首页
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