您现在的位置是:首页 > 技术学习 > Git 网站首页 技术学习 Git

Git 常用命令

Git  
简介 git管理的工作流程: 工作区 -> 暂存区 -> 分支 (暂存区和分支属于版本库) 工作区通过add可以将文件加进缓存区,缓存区通过commit可以到当前分支。

git管理的工作流程:
工作区 -> 暂存区 -> 分支 (暂存区和分支属于版本库)
工作区通过add可以将文件加进缓存区,缓存区通过commit可以到当前分支
工作区: 我们电脑中的文件夹,我们操作文件是在工作区操作。
版本库: 工作区里面隐藏的.git目录。
暂存区: 属于版本库,用于暂存工作区add进来的新文件,和发生修改的内容。
分支:属于版本库,可以理解为记录并连接所有提交的时间线,可有多条分支,HEAD是一个指针,表示当前版本,用于指定当前处于哪个分支的哪次提交上面,默认是在最近一次,可以指定特定的提交。

个人理解:一个版本库相当于5维空间,分支相当于4维空间(时间线),每次的commit是三维空间(时间点),每次commit下的文件是2维空间,文件里面的内容属于1维空间。我们(
HEAD)可以切换到任意分支(时间线)的任意commit(时间点),还可以查看该次commit(时间点)下修改的文件和内容

1. 本地管理

首先我们需要进入到要管理的文件夹下。进入方法 -> 在终端输入: cd 文件夹路径 然后回车即可进入 (windows系统可以用git-bash进行git操作)

1-1 创建版本库 git init

git init   
    该命令是将当前文件夹变为git可以管理的仓库,
    创建完成会在目录下生成.git目录,为隐藏目录。用来跟踪管理版本库的。

1-2 查看文件夹下文件状态 git status

git status
    该命令可以查看git管理的当前文件夹下文件的状态。常见状态:
    1. fatal: Not a git repository 报错,该文件夹没被git管理
    2. Untracked files: 未被管理的文件,可以用git add将其管理起来
    3. Changes to be committed: 文件已暂存,由工作区进入暂存区,
        两种形式的文件:
        modified:发生修改的文件
        new file :新增的文件    
    4. Changes not staged for commit: 已管理的文件发生了修改,但没有提交。
    5. nothing to commit, working tree clean  工作区是干净的,即没发生修改。

1-3 查看修改内容 git diff

git diff   或者   git diff 文件名
    查看修改的内容(工作区和缓存区快照进行对比),前者查看所有修改,后者针对某文件查看相应的修改。
    注: 该命令必须使用在git add之前,add后不能查看修改了就。

1-4 添加文件 git add

git add 文件名   或者   git add -A
    将修改的文件或者将未被管理的文件加进暂存区,前者是添加指定文件,后者是添加所有文件

1-5 撤销修改

git checkout -- 文件名 
    撤销该文件在工作区的修改,不影响暂存区,该命令不能撤销已加入暂存区的修改,
    (其实是用暂存区里的版本替换工作区的版本,一键还原),
    注:文件名前有空格。
git reset HEAD 文件名
    撤销暂存区的修改,重新放回到工作区

1-6 提交修改 git commit

git commit -m "对修改的描述"   
    提交暂存区内容,使用在git add 之后
git commit -a -m "对修改的描述"  或  git commit -am "描述"
    可将工作区修改完或删除的文件直接提交,相当于add和commit组合,
    但是对新增的没被tracked的文件不能这样用,必须先add再commit
git commit --amend
    在push到远端之前,可以在不更改commitId的前提下,修改最近一次的commit 信息,也能修改提交的内容。
    执行命令后会进入 注释页面 的 vm模式, 在里面可以修改commit信息 和提交的内容,修改完保存退出即可。
    如果已经push到远端,那么再次push时候需要执行 -f 强制推送

1-7 查看管理日志 git log

git log
    查看当前分支的提交记录
    (只显示当前所在commit以及之前的commit信息,版本回退后,回退版本之后的提交信息不显示)
    参数:
        1. -n(n为正整数) 
            查看最近几次的提交信息
        2. --pretty=格式名  
            用指定格式来显示每次的提交,有oneline、short、medium(默认值)、full、fuller、raw等,
        3. --author=作者名
            查找指定作者的提交
        4. -p
            展开显示每次提交的内容差异
        5. -stat
            简要显示每次提交文件增改行数
        6. --grep=过滤用的字符
            找到所有提交描述里包含该字符的提交
git reflog
    显示你的每一次命令,并且可以显示出所有操作对应的提交的commit id,
    这样即使进行版本回退(从现在回到过去),也可以通过该命令找到回退版本之后的commit id,
    然后就可以从过去回到现在

注:有时候会遇见git log 中文乱码的问题,解决办法
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
export LESSCHARSET=utf-8

1-8 显示提交的修改内容 git show

git show [options] <options>...
    显示一个或多个对象(可以是:blobs,树,标签和提交)。
git show
    展示当前commit修改的内容(和上个commit做对比)
git show commitID
    展示指定commit做了哪些修改
git show 标签名
    展示指定标签及指向的对象

1-9 版本回退 git reset/git revert

git reset --hard HEAD^
    回退到上个版本,^代表上一个,^^代表上上一个,以此类推,HEAD~66代表回退到往前66个版本。
git reset --hard 想要回退的版本commit id
    回退到指定的版本,commit id不用写全,写前几位就行,git会自动寻找,也不能太少不然可能找出多个版本

git revert 回退的版本commitId    
    是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。

git reset 和 git revert 的区别:

git reset 是直接回退到指定commit进行版本回退,
而 git revert 是回退到指定的commit,然后在其上覆盖新的commit。

push完再进行版本回退后的提交问题:

使用 git reset 回退后在push,会提示本地版本低于远端,push失败,除非使用 --force 强制push。
使用 git revert 回退后再push则不会提示本地版本低于远端,因为revert是在回退之上加了新的commit。

1-10 删除文件 git rm

git rm 文件名
    从暂存区删除该文件。
git rm --cached 文件名
    清除该文件缓存,让文件或目录不再被git管理。
    如果我们需要在.gitignore里面添加一个已经被管理过的文件或目录的时候,
    需要执行这个命令,不然该目录还会被git管理。

1-11 分支

git branch
    查看分支信息,当前分支前有个*号
git branch -a
    查看所有分支,包括远端分支,远程分支用红色显示    
git branch -r
    查看所有的远端分支,搭配 git remote update 可以查看当前所有远端分支            
git branch 分支名
    创建一个新分支
git branch -m 旧分支名 新分支名
    重命名分支    
git branch --set-upstream-to=远端仓库名/远端分支  本地分支
    将本地指定分支和远端指定分支关联(追踪),这样pull、push的时候不用再指定分支了。    
# git branch --set-upstream 本地分支 远端仓库名/远端分支
    不再支持,请用 --set-upstream-to 
    将本地分支追踪到远端分支,方便 pull 和 push 等操作
        例:
            省略远端分支名 git pull origin
            如果只有一个追踪分支,可以省略仓库名 git pull
git checkout 分支名
    切换到该分支下
git checkout -b 分支名
    创建新分支,并切换到该分支。        
git checkout -t origin/远端分支
    在本地 pull 并 切换到对应的远端分支    

1-12 删除分支

git branch -d 分支名
    删除本地该分支,如果本地分支没有被合并会报错
git branch -D 分支名    
    强制删除本地分支,即使没合并也会被删除
git push origin --delete 远程分支名
    删除指定远程分支    
git push origin :远程分支名
    推送一个空分支到远程分支,其实就相当于删除远程分支    

1-13 合并分支一 git merge

git merge 指定的分支名
    合并指定的分支到当前分支,git会优先使用Fast-forward模式。
    合并成功:(没冲突)
        所在分支仍为当前分支,但是指针停留在指定分支的最新提交上。
        (相当于把指定分支所有提交加在当前分支提交之后,并将指针移向合并后最新的提交)
    合并失败:(有冲突)
        解决冲突后需要重新add和commit,重新commit会生成一个新的commit,
git merge 远程仓库名/远程分支名
    合并远程分支到当前本地分支        
git merge --no-ff -m "信息描述" 分支名
    合并指定的分支到当前分支,--no-ff强制禁用Fast-forward模式,
    此时在合并时会在当前分支生成一个新的commit,-m "描述"是用来描述该次commit的。
    合并成功后指针停留在新生成的commit上,而不再是停在指定分支的最新commit上。
    (两个分支在此commit处交叉,各个分支的commit还在原分支上面)

注:

merge合并。内容合并后,各分支的提交信息还在相应的分支上,如果删除某分支,则该分支上相应的提交将丢失。
rebase合并后,分支合并为1个,提交信息都在合并后分支上面

1-14 合并分支二 git rebase

git rebase 指定分支名
    合并指定分支到当前分支。会先将当前分支提交删除,提交信息暂存在rebase里。
    然后把指定分支合并到当前分支上,然后再把当前分支做的更改和提交重新加上去。
    (先同步指定分支提交,在加上当前分支提交)
git rebase -i HEAD~3
    合并3个commit(HEAD和之前的两个)为一个commit,
    之后3个commit会以倒序依次排列,最上面的是最早的提交。
    将第2,3个提交前面的pick改为s或squash,保存退出。
    然后会看到3次的提交信息描述,将其修改为合并后的描述,保存退出。

注:

git rebase 相关操作过程中,
可以随时使用git rebase --abort来中断并恢复到之前的样子。
git rebase --continue用来继续之前的合并。
使用此功能时一般是在push之前,
因为如果有commit已经push,此时将该commit和别的合并,在push会报错。因为会和远端冲突

1-15 保存当前分支工作现场 git stash

git stash
    将当前分支工作现场(工作区和暂存区)暂时保存起来,并使工作区和暂存区变干净。
    此时可进行其他工作。可进行多次保存。
git stash list
    查看当前分支保存的工作现场列表。
git stash apply
    当别的工作做完提交后,可用该命令恢复之前保存的工作现场。但是stash内容并不删除。
git stash apply stash列表中的某次保存
    恢复到指定的stash,例:git stash apply stash@{0}
git stash drop
    删除保存的工作现场
git stash pop
    恢复工作现场,并再恢复的时候把stash内容删掉。
    切换分支后该方法扔可以用,所以可以用该方法将分支上做的修改切换到另一个分支。
    将分支做的修改stash,然后切换到另一个分支 pop 即可

1-16 标签 git tag

git tag
    查看所有标签,按字母顺序列出,不是时间顺序。
git show 标签名
    查看指定标签的信息
git tag 标签名
    打一个指定名字的新的标签(默认打在最新的提交上面)
git tag 标签名 指定的commitid
    在指定的commit上面打一个指定名字的新标签
git tag -a 标签名 -m "描述信息" 指定commitid
    给指定提交打一个带描述信息的指定的标签名。-a指定标签名,-m描述说明
git tag -d 标签名
    删除指定标签
git push origin 标签名
    推送某标签到远程
git push origin --tags
    推送所以没推送的标签
git push origin :refs/tags/标签名
    删除远程标签,前提是先在本地删除本地标签

2. 远程仓库

git还能把本地仓库和远端关联,这样可以实现同步,而且还能实现多人协作。由于本地仓库和远程仓库的传输需要经过ssh加密,因此,我们需要设置SSH Key。常用远程仓库有Github、码云、bitbucket

2-1 和本地电脑建立关联

1. ssh-keygen -t rsa -C "邮箱地址"
    创建成功会生成一个隐藏文件夹.ssh,
    mac下在用户主目录下,
    windows在用户->admin下。
    里面包含三个文件,其中的id_rsa是私钥文件(不外泄),id_rsa.pub是公钥文件(可公开)。

2.  打开id_rsa.pub文件,复制里面的内容到远程SSH keys界面里的key里面,
    起一个title名,远端可添加多个SSH Key。
    点击保存即让本地电脑和远程建立连接,这样远程可知道推送信息的是谁。

2-2 建立远程仓库

在远程上面新建一个项目,建好后会有一个ssh链接。用于和本地仓库建立关联或用于clone。

2-3 本地仓库和远程仓库建立关联

  1. 首先在本地建好仓库,即被git管理的文件夹。(方法见上面的 本地管理 )
  2. 在本地终端中进入本地仓库下,输入:
    git remote add 远程仓库名 版本库网址
    git remote add origin 远程的ssh链接

注:

origin是远程仓库名字,一般远程库默认名字都叫origin。
可以改为别的,如果一个本地要关联多个远程,就要起不同的远程库名字,不然会冲突

2-4 克隆远程仓库git clone

git clone 远程库地址
    克隆指定远程仓库到本地,本地生成的文件名和远程仓库名一样
git clone 远程库地址 本地目录名
    克隆指定远程仓库到本地,并使用自定义的目录名
git clone -o 远程主机名 远程库地址
    -o 参数后面是 远程主机名,默认是 origin, 可以指定特定的远程主机名

注:

git clone支持多种协议,包括:HTTP(s)、SSH、Git、本地文件协议等

2-5 查看远程主机信息git remote

git remote
    查看远程版本库名  // origin
git remote -v
    查看远程仓库详细信息,包括抓取和推送的地址,若没有push权限,则不显示push地址。
git remote update
    更新当前所有远端分支的信息
git remote show 远程仓库名
    查看指定远程仓库的详细信息
    git remote show origin 
        # 查看origin远程仓库的详细信息    

2-6 删除远程关联

git remote remove origin
    删除和origin远端的关联
git remote rm 远程仓库名
    删除远程仓库的关联
git remote rename 原仓库名 新仓库名
    重命名远程仓库

2-7 拉取远程更新到本地 git fetch

拉取远程的更新,不影响本地的代码。
如果要在本地查看远程的更新,需要使用 “远程仓库名/远程分支名” 的形式去查看或操作
例:git merge origin/test  将远程分支的合并到当前分支

git fetch 远程仓库名
    拉取远程所有分支的更新到本地
    git fetch origin 
        # 将origin下的所有分支拉到本地
git fetch 远程仓库名 远程分支名
    拉去远程仓库下指定分支的更新到本地        

2-8 抓取远程更新git pull

git pull
    抓取远程仓库所有分支更新并合并到本地。git pull = git fetch + git merge
git pull --rebase
    抓取远程仓库的更新,在此基础上将自己的修改加上去。
git pull --rebase = git fetch + git rebase。
    如果发生冲突,会让停止rebase,解决完冲突后用git add更新内容,
    然后执行git rebase --continue。
git pull --no-ff
    抓取远程仓库所有分支更新并合并到本地,不要快进合并
git pull 远程仓库名 远程分支名:本地分支名
    将指定远程分支拉取并合并到指定本地分支
    例:git pull origin master:dev
git pull 远程仓库名 远程分支名
    将远程仓库指定分支合并到当前分支    
git pull -p
    -p 参数:在本地删除远程已经删除的分支
    等同于:
        git fetch --prune origin 
        git fetch -p        

2-9 推送到远程 git push

git push -u origin master
    将本地仓库当前分支推送到origin远程库的master分支,
    当远程仓库是空时,第一次推送需要加上-u参数,指定origin远程库为默认主机,之后可以用简化推送指令。
    当前分支和多个仓库存在追踪关系的话,-u 参数可以指定默认主机,默认追踪的分支可以使用简化指令
git push origin master
    将本地仓库当前分支推送到origin远程库的master分支
git push
    将当前分支推送到默认主机
git push origin 远程分支名
    将本地当前分支推送远程指定分支,如果远程分支不存在,则在远程创建该分支    
git push origin 本地分支名:远程分支名
    将本地分支推送至远端,并把 本地指定分支 作为 远端指定的分支    
    如果左边本地分支为空,那么将删除后面的远端分支名
git push origin :远程分支名
    删除远程指定分支    
git push origin --delete 远程分支名
    删除远程指定分支    
git push --all origin 
    将本地所有分支推送到origin远程库。
git push origin --tags
    将标签也推送至远程库,git push默认不会推送标签tags,需加--tags参数
git push origin HEAD
    将当前分支推送至origin远程库下的同名分支

其他参数:
    -f  或者  --force
        强制推送并覆盖远端,有时候本地版本回退后,再push会提示本地版本behind远端,不让push,
        这时候在push命令中加 -f 可强制将本地内容push到远端并覆盖远端原有内容。
    注:
        慎用,特别是多人协作的时候,尽量别用-f。

 
个人SCDN博客

Top