git 命令速查

这篇博客将记录使用 git 过程中常用的命令,以及 git 出现问题时的解决方案。

速查表

git常用命令速查表

常用

配置 git 账户:

配置git 告诉其他开发者你是谁,怎么联系你。这些信息可以是全局的,也可以在单个项目中单独设置。
全局的配置文件位于~/.gitconfig
项目的配置文件位于<project>/.git/config

  • 全局配置

    1
    2
    git config --global user.name 'yourname'
    git config --global user.email 'name.email.com'
  • 单个项目配置

    1
    2
    git config --local user.name 'yourname'
    git config --local user.email 'name.email.com'

密钥种种:

  • 1、查看是否有ssh key设置,进入.ssh目录,看是否有公钥和私钥文件。

    1
    cd ~/.ssh
  • 2、生成密钥

    1
    ssh-keygen -t rsa -C "oulafen.email.com"

    连续三个回车,如果不需要密码的话。
    最终得到两个文件:id_rsaid_rsa.pub,其中id_rsa.pub是公钥,远程git服务器要求添加的ssh key就是这个文件里的内容。
    windows下默认生成目录在/c/Users/xxxx_000/.ssh/或者/c/Users/pc/.ssh/中。
    mac下默认生成目录在~/.ssh/

  • 3、测试ssh key是否配置成功

    1
    ssh -T git@github.com

查看

1
2
3
4
5
6
7
8
9
git status  #查看当前版本状态(是否修改) 

git log # 显示提交日志
git log -1 # 显示1行日志 -n为n行
git log --stat # 显示提交日志及相关变动文件

git show dfb02 # 可只用commitid的前几位
git show HEAD # 显示HEAD提交日志
git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本

分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
git branch      #显示本地分支
git branch -a #显示所有分支
git branch -r #显示所有原创分支
git branch --merged #显示所有已合并到当前分支的分支
git branch --no-merged #显示所有未合并到当前分支的分支
git branch -m master master_copy #本地分支master改名为master_copy

git branch -d branchname #branchname(本分支修改已合并到其他分支)
git branch -D branchname #强制删除分支branchname

git checkout -b master_copy #从当前分支创建新分支master_copy并检出
git merge branchname #合并branchname分支至当前分支
git push origin master_copy #将当前分支push到远程master_copy分支,若没有,则新建

git fetch #获取所有远程分支(不更新本地分支,另需merge)
git fetch --prune #获取所有原创分支并清除服务器上已删掉的分支
git pull origin master #获取远程分支master并merge到当前分支

图形化显示项目历史

1
gitk

放弃修改 及 版本回退

1
2
3
4
5
6
git checkout bb.txt    #bb.txt文件修改了并被git管理,可恢复到上一次没被修改前的状态
git checkout #git放弃对当前文件夹的所有文件的修改

git reset HEAD filename #从暂存区中移除文件
git reset --hard HEAD~3 #将最新的3次提交全部重置,就像没有提交过一样
git reset --hard {版本号} #彻底回退到指定版本

对新建项目的123操作

  • 1、在远程git库上新建项目test,以库git.oschina为例
  • 2、复制项目链接

    1
    git clone git@git.oschina.net:oulafen/test.git
  • 3、本地执行

    1
    2
    3
    4
    5
    6
    cd test
    git init
    #然后新建 .gitignore 文件,写上自己想过滤的文件
    git add .
    git commit -m 'first commit and add gitignore'
    git push

问题总结

  • 常规的提交流程是什么?

    • git push之前进行git pull操作,意思就是将本地修改提交到线上之前先将线上别人已提交的修改同步到本地,这样一般不会有冲突,pull的位置如下:
      1
      2
      3
      4
      git add .    //添加所有修改文件(不包括删除操作),若有删除的文件需执行 git add -u
      git commit -m 'balabala'
      git pull
      git push
  • git pull更新本地代码时出现冲突怎么办?

    使用git stash命令进行处理

    1
    2
    git stash   #先将本地修改存储起来
    git stash list #查看保存的信息


    其中stash@{0}是刚才保存的标记。

    1
    2
    git pull       #更新代码
    git stash pop #还原暂存的内容

    此时,系统会有类似Auto-merging ...balabala...的提示,意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。
    打开冲突的文件,会看到如下类似的内容

    1
    2
    3
    4
    5
    <<<<<<< Updates upstream
    balabala
    =======
    balabala
    >>>>>>> Stashed changes

    其中<<<<<<< Updated upstream=======之间的内容就是pull下来的内容,
    =======>>>>>>> stashed changes之间的内容就是本地修改的内容。
    碰到这种情况,git也不知道哪行内容是需要的,所以要自行确定需要的内容。
    将不需要的内容删掉,然后正常的提交就可以了。

  • 执行完git push之后,报警warning: push.default is unset; its implicit value has changed in Git 2.0 from 'matching' to 'simple'.,具体如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    warning: push.default is unset; its implicit value has changed in
    Git 2.0 from 'matching' to 'simple'. To squelch this message
    and maintain the traditional behavior, use:

    git config --global push.default matching

    To squelch this message and adopt the new behavior now, use:

    git config --global push.default simple

    When push.default is set to 'matching', git will push local branches
    to the remote branches that already exist with the same name.

    Since Git 2.0, Git defaults to the more conservative 'simple'
    behavior, which only pushes the current branch to the corresponding
    remote branch that 'git pull' uses to update the current branch.

    ...

    根据提示,可进行两个操作 git config --global push.default matching 或者 git config --global push.default simple,两者区别如下:

    • 前者git push会把你本地所有分支push到名称相对应的远程主机上。这意味着可能你会在不经意间push一些你原本没打算push的分支。
    • 后者git push仅仅把当前所在分支push到从当初git pull pull下来的那个对应分支上
git