Git常用命令

Git常用命令

全局设置

a. 设置用户信息

$ git config --global user.name "Your Name"  
$ git config --global user.email "email@example.com"

b. 设置编辑器

$ git config --global core.editor emacs

c. 设置差异比较器

$ git config --global merge.tool vimdiff

d. 设置显示不同的颜色

$ git config --global color.ui true

e. 查看全局设置信息

$ git config --global -l

SSH Key设置

a. 生成SSH key

$ ssh-keygen -t rsa -C "youremail@example.com"

b. 复制id_rsa.pub内容到粘贴板中

$ cat ~/.ssh/id_rsa.pub

c. 登陆Github > 设置 > SSH and GPG Keys > new SSH key

d. 复制粘贴板中的内容到key文本编辑框中

e. 点击Add SHH key按钮

f. 查看是否设置SSH成功

$ ssh [-p port] git@github.com

创建仓库

a. 进入需要创建仓库的目录

$ mkdir studygit
$ cd studygit
$ pwd
/Users/username/studygit

b. 在当前目录创建仓库

$ git init

添加远程库

a. 把一个已有的本地仓库与远程仓库关联

$ git remote add origin git@github.com:liangyunfeng/git.study.git

b. 本地库的所有内容推送到远程库上

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

$ git push -u origin master

c. 之后推送本地库到远程库上使用

$ git push origin master

把文件添加到暂存区

$ git add readme.txt

把文件添加到版本库

$ git commit -m "wrote a readme file"

查看仓库的当前状态

$ git status

查看修改内容

$ git diff readme.txt 

查看提交历史

$ git log

查看命令历史

$ git reflog

版本回退

$ git reset --hard commit_id 
$ git reset --hard HEAD <filename>
$ git reset --hard HEAD^^
$ git reset --hard HEAD~2

撤销修改

$ git checkout -- file

命令git checkout – file意思就是,把file文件在工作区的修改全部撤销,这里有两种情况:
一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是filet已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

把暂存区的修改撤销掉(unstage),重新放回工作区

$ git reset HEAD <file>

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退git reset –hard commit_id,不过前提是没有推送到远程库。

删除文件

$ git rm test.txt
$ git commit -m "description"

工作区误删文件,恢复到版本库最新版本

$ git checkout -- file

关联远程库

$ git remote add origin git@server-name:path/repo-name.git

关联后,第一次推送master分支的所有内容

$ git push -u origin master

此后,提交到远程库

$ git push origin master

从远程库克隆

$ git clone git@server-name:path/repo-name.git

创建分支

$ git branch <name>

切换分支

$ git checkout <name>

查看分支

$ git branch

创建+切换分支

$ git checkout -b <name>

合并某分支到当前分支

$ git merge <name>

删除分支

$ git branch -d <name>

解决冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

查看分支合并图

$ git log --graph

普通模式合并某分支到当前分支

$ git merge --no-ff -m "merge with no-ff" <name>

合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

工作现场隐藏

$ git stash

查看工作现场

$ git stash list

工作现场恢复但不删除工作现场

$ git stash apply [stash@{0}]

工作现场恢复并删除工作现场

$ git stash pop

查看远程库信息

$ git remote

查看远程库详细信息

$ git remote -v

从本地推送分支

$ git push origin branch-name

从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

在本地创建和远程分支对应的分支

$ git checkout -b branch-name origin/branch-name

建立本地分支和远程分支的关联

$ git branch --set-upstream branch-name origin/branch-name

从远程抓取分支

$ git pull

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

关联远程库

$ git remote add <name> git@github.com:liangyunfeng/git.study.git

远程库重命名

$ git remote rename <oldname> <newname>

删除远程库

$ git remote rm <name>

重新设置基线

$ git rebase

原理很简单:rebase需要基于一个分支来设置你当前的分支的基线,这基线就是当前分支的开始时间轴向后移动到最新的跟踪分支的最后面,这样你的当前分支就 是最新的跟踪分支。这里的操作是基于文件事务处理的,所以你不用怕中间失败会影响文件的一致性。在中间的过程中你可以随时取消rebase 事务。git rebase –abort

git rebase其实可以把它理解成是“重新设置基线”,将你的当前分支重新设置开始点。这个时候才能知道你当前分支于你需要比较的分支之间的差异。

创建标签

$ git tag <tagname> [commitid]

可以指定commitid,默认为HEAD

git tag -a <tagname> -m "decription" [commitid]

创建带有说明的标签,用-a指定标签名,-m指定说明文字

查看标签

$ git tag

看标签信息

$ git show <tagname>

删除标签

$ git tag -d <tagname>

推送一个本地标签

$ git push origin <tagname>

推送全部未推送过的本地标签

$ git push origin --tags

删除一个远程标签

$ git push origin :refs/tags/<tagname>

忽略文件

忽略某些文件时,需要编写.gitignore;

gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

如果你确实想添加该文件,可以用-f强制添加到Git:
$ git add -f App.class
$ git check-ignore -v App.class

配置别名

$ $ git config --global alias.<name> 'option...'

$ git config –global alias.unstage ‘reset HEAD’
当你敲入命令:
$ git unstage file
实际上Git执行的是:
$ git reset HEAD file

搭建Git服务器

a. 安装git

$ sudo apt-get install git

b. 创建一个git用户,用来运行git服务:

$ sudo adduser git

c. 创建证书登录:

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

d. 初始化Git仓库:

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

$ sudo git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

$ sudo chown -R git:git sample.git

e. 禁用shell登录:

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

f. 克隆远程仓库:

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

$ git clone git@server:/srv/sample.git

git push

$ git push origin master

origin指定了你要push到哪个remote
master其实是一个“refspec”,正常的“refspec”的形式为”+:”,冒号前表示local branch的名字,冒号后表示remote repository下 branch的名字。注意,如果你省略了,git就认为你想push到remote repository下和local branch相同名字的branch。听起来有点拗口,再解释下,push是怎么个push法,就是把本地branch指向的commit push到remote repository下的branch,比如:

$ git push origin master:master                (在local repository中找到名字为master的branch,使用它去更新remote repository下名字为master的branch,如果remote repository下不存在名字是master的branch,那么新建一个)
$ git push origin master                    (省略了<dst>,等价于“git push origin)master:master”)
$ git push origin master:refs/for/mybranch    (在local repository中找到名字为master的branch,用他去更新remote repository下面名字为mybranch的branch)
$ git push origin HEAD:refs/for/mybranch    (HEAD指向当前工作的branch,master不一定指向当前工作的branch,所以我觉得用HEAD还比master好些)
$ git push origin :mybranch                    (再origin repository里面查找mybranch,删除它。用一个空的去更新它,就相当于删除了)

git fetch 和 git pull 的区别

git fetch:相当于是从远程获取最新版本到本地,不会自动merge

$ git fetch origin master
$ git log -p master ../origin/master
$ git merge origin/master

以上命令的含义:
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并

git pull:相当于是从远程获取最新版本并merge到本地

$ git pull origin master

上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并

git log

git log [<options>] [<since>..<until>] [[--] <path>...]

这条命令有很多参数选项

一、不带参数
    1.如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明
    2.如果记录过多,则按Page Up、Page Down、↓、↑来控制显示
    3.按q退出历史记录列表

二、显示参数
    1.-p:按补丁显示每个更新间的差异,比下一条- -stat命令信息更全
    2.--stat:显示每次更新的修改文件的统计信息,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计
    3.--shortstat:只显示--stat中最后的行数添加修改删除统计
    4.--name-only:尽在已修改的提交信息后显示文件清单
    5.--name-status:显示新增、修改和删除的文件清单
    6.--abbrev-commit:仅显示SHA-1的前几个字符,而非所有的40个字符
    7.--relative-date:使用较短的相对时间显示(例如:"two weeks ago")
    8.--graph:显示ASCII图形表示的分支合并历史
    9.—pretty=:使用其他格式显示历史提交信息,可选项有:oneline,short,medium,full,fuller,email,raw以及format:<string>,默认为medium,如:
        1.--pretty=oneline:一行显示,只显示哈希值和提交说明(--online本身也可以作为单独的属性)
        2.--pretty=format:” ":控制显示的记录格式,如:
    10.--date= (relative|local|default|iso|rfc|short|raw):定制后边如果出现%ad或%cd时的日期格式

三、筛选参数:
    1.按数量
    2.按日期
    3.按作者
    4.按commit描述
    5.按文件
    6.按分支
    7.按内容
    8.按范围
    9.过滤掉merge commit
    10.按标签tag  
    11.按commit

git help

$ git help
$ git clone -help
$ git init -help
$ git add -help
$ git tag -help
$ git pull -help
$ git push -help
$ git status -help
$ git commit -help
$ git checkout -help
$ git merge -help
$ git stash -help