git命令速记

前言

git是一个很神奇的工具,是由Linux的发起者linus用c语言编写的…
最常用的其实只有十几个命令,其他的可以等到真正的团队合作的时候去复习一下。
在这里记录一下常用命令,想要学习git推荐廖雪峰的Git教程

状态图

git_status.jpg
git_status2.jpg

安装git

基本操作

1
2
git #检测是否已安装git
sudo apt install git

常用(创建项目时)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
第一次在新电脑创建项目,需要添加res公钥到github
cd ~/.ssh/
ssh-keygen -t rsa -C "email@email.com" #双引号中是github的邮箱
将此目录下生成的rsa公钥复制到github

本地创建新的项目
git init
git remote add origin git@github.com:xxx/xxx.git
git pull git@github.com:xxx/xxx.git
git push -u origin master
git pull

设置用户和邮箱
git config --global user.name "YIFEI"
git config --global user.email "xxx@xx.com"

根据远程test_dev分支创建本地test_dev2分支
git fetch origin test_dev:test_dev2
该方式会在本地新建分支x,但是不会自动切换到该本地分支x,
需要git checkout test_dev2 手动切换过去。
采用此种方法建立的本地分支不会和远程分支建立映射关系。

git pull origin master #从远程master分支拉取回来,合并分支到当前分支
git push origin test_dev #push到远程test_dev分支

git fetch 相当于是从远程获取最新到本地,不会自动merge,如下指令:
git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
git log -p master origin/master //比较本地的master分支和origin/master分支的差别
git merge origin/master //将origin/master合并到当前分支

ssh-keygen -t rsa -C "你的github邮箱" #生成公私钥
然后将/users/xxx/.ssh下的id_rsa.pub复制,添加到github
ssh-add #将密钥添加到ssh-agent高速缓存中
SSH -T git@github.com #测试密钥是否设置成功

git常用命令

  • 创建版本库

    1
    2
    3
    4
    mkdir mygit
    cd mygit
    git init
    ll #可以发现多了一个.git目录
  • 添加到暂存区

    1
    2
    3
    4
    5
    git add readme.txt
    git add . #提交新文件和修改的文件,不提交被删除的文件
    git add -u #提交修改的和被删除的文件,不提交新文件
    git add -A #提交所有的变化
    ps:git 2.0中git add .改成提交所有变化了
  • 提交到仓库

    1
    2
    git commit -m "this is a  readme file"
    -m message
  • 查看工作状态

    1
    git status
  • 查看修改内容

    1
    git diff
  • 切换版本

    1
    2
    git reset --hard commit_id
    HEAD是当前版本
  • 查看提交历史

    1
    2
    3
    4
    5
    6
    7
    git log
    git reflog #查看命令历史,可以用于重返未来
    git log --graph #查看分支合并图
    git log --graph --pretty=oneline --abbrev-commit #查看详细log
    终极版:
    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
    git lg #查看效果
  • 撤销工作区的修改

    1
    2
    git checkout -- readme.txt
    工作区的修改会被还原,还原成暂存区的内容
  • 还原暂存区的内容(用HEAD版本的内容)

    1
    git reset HEAD readme.txt
  • 从版本库中删除文件

    1
    2
    git rm test.txt
    git commit -m "remove test.txt"

远程库管理

  • 关联远程库

    1
    2
    git remote add origin git@github.com:xxxxx/xxxxx
    origin是远程库的名字
  • 将本地库推送到远程库

    1
    2
    3
    4
    5
    6
    git push -u origin master
    从本地的master推送到远程的origin
    第一次clone或push可能会有ssh警告
    第一次需要添加-u参数,以后可以直接
    git push origin master
    git push origin new_branch #推送new_branch分支到远程库
  • 克隆远程库

    1
    2
    cd moumulu
    git clone git@github.com:xxxx/xxxx
  • 将远程库合并到本地

    1
    2
    3
    git pull
    如果提示no tracking information,说明本地分支与远程分支连接没有创建,使用:
    git branch --set-upstream-to <branchname> origin/<branchname>
  • 查看远程库信息

    1
    2
    git remote
    git remote -v
  • 删除远程库文件或目录

    1
    2
    3
    git rm -r --cached path
    git commit -m "delete remote file"
    git push

分支管理

  • 查看当前分支

    1
    git branch
  • 创建分支

    1
    2
    3
    4
    git checkout -b newbranch
    -b 表示创建并切换,相当于
    git branch newbranch
    git checkout newbranch
  • 根据远程分支创建本地分支

    1
    git checkout -b abc origin/abc #abc为分支名(注意这里要创建相同的名字,不然推送的时候会失败)
  • 推送本地分支到远程

    1
    git push origin localbranch:remotebranch
  • 修改分支名

    1
    git branch -m old_branch new_branch
  • 切换分支

    1
    git checkout branchname
  • 合并分支到当前分支

    1
    2
    3
    4
    5
    git checkout master #切换到master分支
    git merge branchname #将branchname合并到当前分支
    建议用:
    git merge --no-ff -m "blabla..." branchname
    这样不使用快速合并,可以在log里保留记录
  • 删除分支

    1
    2
    git branch -d branchname
    git branch #查看
  • 使用rebase修改“基版本”(rebase命令会改变历史,建议只在个人分支使用)

    1
    2
    3
    4
    # 当基于master版本创建新分支b1并进行了修改后,master版本已经发生了变化,此时使用rebase将b1的基版本改为master的最新版本。
    git checkout b1
    git rebase master
    # 如果发生冲突,手动解决后需要执行 git rebase --continue
  • 使用rebase合并多个提交

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    git rebase -i  [startpoint]  [endpoint]
    # -i 的意思是 --interactive,即弹出交互式的界面让用户编辑完成合并操作
    # startpoint 和 endpoint 指定了一个左开右闭区间,startpoint会被保留
    # 如果不指定endpoint,则该区间的终点endpoint默认是当前分支HEAD所指向的提交
    # 也可用该命令合并最近n个提交git rebase -i HEAD~n

    # 之后弹出窗口让修改合并方式
    pick:保留该commit(缩写:p)
    reword:保留该commit,但我需要修改该commit的注释(缩写:r)
    edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
    squash:将该commit和前一个commit合并(缩写:s)
    fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
    exec:执行shell命令(缩写:x)
    drop:我要丢弃该commit(缩写:d)

    # 一般使用如下方式将后面提交都合并到第一个提交上。
    pick 85697ee This is first commit.
    squash ee461c1 This is second commit.
    squash 326e415 This is third commit.

    # 此时处在一个临时分支上,可创建新分支
    git checkout -b newbranch

    # 若发生冲突可解决冲突后,使用如下命令继续或终止rebase操作。
    git rebase --continue
    git rebase --abort
  • 使用cherry-pick将提交应用到其他分支

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    git cherry-pick hash #将某次提交应用到当前分支
    git cherry-pick hasha hashb hashc #将多次提交应用到当前分支
    git cherry-pick hasha..hashb #将hasha之后,直到hashb之间的提交应用到当前分支(不包含hasha)
    git cherry-pick hasha^..hashb #将hasha到hashb之间的提交应用到当前分支(包含hasha)

    参数
    -e,--edit #打开外部编辑器,编辑提交信息。
    -n,--no-commit #只更新工作区和暂存区,不产生新的提交。
    -x #在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。
    -s,--signoff #在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。

    处理冲突
    # 用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。
    git cherry-pick --continue

    # 发生代码冲突后,放弃合并,回到操作前的样子。
    git cherry-pick --abort

    发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。
    git cherry-pick --quit

模块管理

  • 添加模块
1
git submodule add https://xxxxxxx/xxx.git pathname
  • 克隆项目和submodule
    1
    2
    3
    git clone https://xxx/xxx.git
    git submodule init
    git submodule update

或用一句搞定

1
git clone --recursive https://xxx/xxx.git

标签管理

  • 查看标签

    1
    git tag
  • 添加标签

    1
    2
    git checkout branchname
    git tag <tagname>
  • 对某次提交打标签

    1
    2
    3
    4
    git tag v0.9 a3k9359
    git tag -a v0.1 -m "version v0.1 released" a3k9359
    -a 指定标签名
    -m 添加注释
  • 查看标签信息

    1
    git show <tagname>
  • 删除标签

    1
    git tag -d v0.1
  • 推送某标签到远程

    1
    git push origin v1.0
  • 删除远程标签

    1
    2
    git tag -d v0.2 #先删除本地标签
    git push origin :refs/tags/v0.2 #删除远程标签

自定义git

  • 忽略特殊文件

    1
    2
    3
    根目录下新建 .gitignore 文件,写入文件名或.exe等类型
    git add -f a.exe #强制添加到git
    git check-ignore -v a.exe #检查规则
  • 配置文件

    1
    .git/config #配置文件存放地

问题记录

  • 有时候因为本地修改的太乱了,想直接用远程库替换本地的库可以使用下面两条命令

    1
    2
    git fetch --all #用远程库还原本地版本库
    git reset --hard origin/master #用origin/master版本库内容还原暂存库
  • 当改乱了工作区内容时,想丢弃工作区的修改 git checkout – file

  • 当改乱了文件,并且添加到了暂存区,先git reset HEAD ,再用git checkout – file
  • 当改乱了之后,并且提交到了本地版本库,使用git reset –hard 版本号 可以在各个版本之间穿梭
  • git中的check out,主要有以下两个功能:
      1.创建、切换分支。
      2.用暂存区或版本区的内容恢复到工作区。
      具体使用方法可查看蚂蚁部落教程。
  • 不小心提交了没用的文件到远程库

    1
    2
    3
    4
    5
    git rm -r --cached test/a.txt // 删除test文件夹下的a.txt文件,加入到删除缓存中
    git commit -m '删除test文件夹下的a.txt文件' // 执行删除缓存,提交文字为“删除test文件夹下的a.txt文件”
    git rm -r --cached test // 删除test文件夹,加入到删除缓存中
    git commit -m '删除test文件夹' // 执行删除缓存,提交文字为“删除test文件夹”
    git push // 推送操作到远程仓库
  • 每次add之前git status查看修改了哪些文件,每次只add修改过的文件,可以防止提交了无用的文件

  • 需要回退版本

    1
    2
    git log 或者 git reflog
    git reset --hard <commit_id> 或者 git reset --hard HEAD@{x}
  • 只恢复某个文件

    1
    2
    git checkout b284c80c2648f886267ea76348ca7981db8cc test/test.txt
    git checkout commit filepath
  • 暂时储藏当前的修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    有时候你改了一些文件,但此时想要切换到别的分支上工作,此时是无法切换成功的。
    这时候就需要下面这条命令:
    git stash #将当前修改暂时储藏起来
    git stash pop 或者 git stash apply 将上次的储藏恢复
    或者也可以这样:
    $ git stash list
    stash@{0}: WIP on master: 049d078 added the index file
    stash@{1}: WIP on master: c264051 Revert "added file_size"
    stash@{2}: WIP on master: 21d80a5 added number to log
    $ git stash apply stash@{2}
  • git diff

    1
    2
    3
    4
    5
    6
    $ git diff            #(1)
    $ git diff --cached #(2)
    $ git diff HEAD #(3)
    1.工作树中的更改尚未分段进行下一次提交。
    2.索引和最后一次提交之间的变化; 查看已经git add ,但没有git commit 的改动。
    3.自上次提交以来工作树中的更改;如果运行“git commit -a”,查看将会提交什么。
  • 抛弃所有改变,同步到最新远程库

    1
    2
    3
    4
    5
    6
    7
    git强制覆盖本地代码:
    git fetch --all
    git reset --hard origin/master
    git pull

    或(慎用)
    git fetch --all && git reset --hard origin/master && git pull

参考

欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/