简介

版本管理基本上是多人协作开发中必不可少的工具,常用的版本管理工具有:svn和git。虽然都有可视化的工具帮助我们使用这些工具,然而当你用上命令行之后,我想你会选择抛弃这些可视化工具。下面是我整理的一些常用的Git命令。

一个比较全面很好的Git书: Git Pro 第二版

一些概念:

  1. 工作区与暂存区
    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
    工作区就是你在电脑里能看到的目录,比如我的testgit文件夹就是一个工作区,但不包括.git这个隐藏目录.
    工作区有一个隐藏目录.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就可以一次性把暂存区的所有修改提交到分支。
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。

  1. global选项
    配置Git的时候,加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用

1. 配置Git邮箱和用户名, 因为每一次提交都需要这些信息

1
2
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

注意:
如果用了 –global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 –global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

2. 查看git配置信息

1
2
3
git config --list #检查已有的配置信息
git config user.name #查看git用户名
git config user.email #查看git邮箱

3. 在本地保存github帐号的用户名和密码,不用每次输入用户名和密码

使用https协议时,在向远程仓库push提交内容时,总是每次要求输入你的github用户名和密码
解决办法:

  1. 设置记住密码(默认15分钟)

    1
    git config --global credential.helper cache
  2. 自己设置记住密码时间,比如一小时

    1
    git config credential.helper ‘cache --timeout=3600’
  3. 长期存储密码

    1
    git config --global credential.helper store

配置好后在 .gitconfig 文件中可以看到.

4. 配置github上ssh密匙,不用每次输入用户名和密码

使用ssh协议时,也要输入用户名和密码,要想不用每次输入用户名和密码,则在你的本地机器生成ssh的私匙和公匙,
私匙保存在本地机器,公匙保存在你的github网站上的帐号设置上.

  1. 创建SSH Key
    在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,
    如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

    1
    $ ssh-keygen -t rsa -C "youremail@example.com"
  2. 登陆GitHub,打开“Settings”,“SSH and GPG Keys”页面

  3. 点击“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容

5. 移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 –cached 选项即可

1
git rm --cached readme.txt

6. 修改.gitignore并更新本地和远程仓库

  1. 在.gitignore修改过滤规则,并保存.
  2. 更新本地和远程仓库
    1
    2
    3
    4
    # 注意有个点“.”
    git rm -r --cached .
    git add -A
    git commit -m "update .gitignore"

配置.gitignore
所有配置文件可以直接在线浏览:https://github.com/github/gitignore
当然也可以配置全局忽略的文件,这样就不用每个项目都加gitignore了:git config --global core.excludesfile '~/.gitignore'

7. 丢弃本地修改,使用远程仓库的内容

1
2
3
4
git fetch --all
git reset --hard origin/master
git fetch 只是下载远程的库的内容,不做任何的合并,
git reset 把HEAD指向刚刚下载的最新的版本

8. 本地仓库首次推送到github远程仓库

  1. 在github上建立一个和本地同名的仓库名称
  2. 在本地命令行输入:git remote add origin 远程仓库地址
  3. 将本地仓库同步到github远程仓库:git push -u origin master

9. 恢复本地删除的文件

恢复已commit的文件:Git checkout commit_id -- file_name
恢复未commit的文件:git checkout -- file_name

10. 打标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git tag #显示已有标签
git tag -l 'v1.4.2.*' #用特定的搜索模式列出符合条件的标签
#创建一个含附注类型的标签,-a (译注:取 annotated 的首字母)指定标签名字,-m 选项则指定了对应的标签说明
git tag -a v1.4 -m 'my version 1.4'
git show v1.4 #查看相应标签的版本信息,并连同显示打标签时的提交对象
git tag v1.4 #创建轻量级标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字即可
git push origin v1.5 #默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库
git push origin --tags # 一次推送所有本地新增的标签,可以使用 --tags 选项
# 删除标签
git tag -d v0.1
# 删除远程仓库标签,先从本地删除,再从远程删除
git tag -d v0.9
git push origin :refs/tags/v0.9

11. git将本地仓库上传到远程仓库

本地新建了一个文件夹,并执行了git init,初始化为一个git仓库了, 然后add,再commit后,想要把本地仓库内容上传到github上去,但此时github上没有这个仓库.
因此先到github上创建与你本地仓库同名的仓库,此时还是一个空仓库,需要把本地的内容上传到github上

1
2
3
git remote add origin https://github.com/yourname/yourrepo.git
git push -u origin master # 第一次推送master分支时,加上了-u参数
git push origin master

12. 版本回退

在 Git中,用HEAD表示当前版本,也就是最新的提交commit id,
上一个版本就是HEAD^,上上一个版本就是HEAD^^,
往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

1
2
3
4
5
6
7
8
9
10
# 查看日志
git log
# 简化日志信息
git log --pretty=oneline
# 当前版本回退到上一个版本,就可以使用git reset命令:
git reset --hard HEAD^
# 当前版本是过去的某个版本,想回到当前版本的之后的版本
git reset --hard 2e70fdf(commit id)

撤销修改

1
2
# 把readme.md文件在工作区的修改全部撤销,即让这个文件回到最近一次git commit或git add时的状态,也可使用reset
git checkout -- readme.md

Git显示颜色,会让命令输出看起来更醒目

1
git config --global color.ui true

fatal: remote origin already exists

如果输入$ Git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git
提示出错信息:fatal: remote origin already exists.

解决办法如下:
1.先输入$ git remote rm origin

2.再输入$ git remote add origin git@github.com:djqiang/gitdemo.git 就不会报错了!

3.如果输入$ git remote rm origin 还是报错的话,error: Could not remove config section ‘remote.origin’. 我们需要修改gitconfig文件的内容

4.找到你的github的安装路径,我的是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_ca477551eeb4aea0e4ae9fcd3358bd96720bb5c8\etc

5.找到一个名为gitconfig的文件,打开它把里面的[remote “origin”]那一行删掉就好了!

使用git在本地创建一个项目的过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建一个项目hello-world
$ makdir ~/hello-world
# 打开这个项目
$ cd ~/hello-world
# 初始化
$ git init
$ touch README
# 更新README文件
$ git add README
# 提交更新,并注释信息“first commit”
$ git commit -m 'first commit'
# 连接远程github项目
$ git remote add origin git@github.com:defnngj/hello-world.git
# 将本地项目更新到github项目上去
$ git push -u origin master

如果输入$ git push origin master

提示出错信息:error:failed to push som refs to …
解决办法如下:

  1. 先输入$ git pull origin master //先把远程服务器github上面的文件拉下来
  2. 再输入$ git push origin master
  3. 如果出现报错 fatal: Couldn’t find remote ref master或者fatal: ‘origin’ does not appear to be a git repository以及fatal: Could not read from remote repository.
  4. 则需要重新输入$ git remote add origin git@github.com:djqiang/gitdemo.git