Fork me on GitHub

Git基本命令

Git 常用命令

Git command

安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中

git config --global user.name "jasonhzy"
git config --global user.email "lotush@163.com"

检查你的设置(Checking Your Settings) 命令:

git config --list
  user.name=Scott Chacon
  user.email=schacon@gmail.com
  color.status=auto
  color.branch=auto
  color.interactive=auto
  color.diff=auto
  ...

创建一个本地仓库的克隆版本

初始化Git仓库

git init --bare xxxx.git #xxx.git即仓库名称    

克隆代码仓库

git clone https://github.com/PinetTech/pinet-wechat.git <指定目录>

克隆指定分支(jason分支)

git clone -b jason https://github.com/PinetTech/pinet-wechat.git

添加文件到缓冲区

git add <filename>或者git add *

提交文件

git commit -m "代码提交信息"

对于当前已经提交过的信息,如需要修改,可执行:

git commit --amend

对于当前已经提交过作者信息,如需要修改,可执行:

git commit --amend --author="newName <newEmail>"        

修改整个历史记录中的某些错误的author、email的方式: git rebase

# git rebase  模式
git rebase -i -p a990e4e63c9e2dc19396efc51b693c314f3384d4 
# 弹出编辑器,在需要修改的 commit 处 由 picked 改变为 edit ,然后 wq 退出 vim;
git commit --amend --author 'newName <newEmail>'
# 执行后即变更了相应的 author 和 email 
git rebase --continue 

你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库

git push origin <branchName>

可以把 master 换成想要推送的任何分支,创建分支并切换过去

git checkout -b <branchName>

切换回某个分支:

git checkout <branchName>

创建、查看、删除、重命名分支

创建分支:

git branch <branchName>

查看分支:

git branch #查看本地分支
git branch -a #查看远程分支

删掉新建的分支(本地分支):

git branch -d <branchName>

删除远程分支:

git push origin --delete <branchName> 或者 git push origin :<branchName>

重命名本地分支:

git branch -m <old_branch_name> <new_branch_name>

删除不存在对应远程分支的本地分支:

git remote prune origin或者git fetch -p

git上修改后还原所有的

git reset --hard

提交之前撤销add操作

git reset HEAD 或者    git revert HEAD --no-commit

查看文件被谁改动

git blame FILE

还原已经add或commit的

git log 命令查看提交的历史记录
在Git中,用HEAD表示当前版本,也就是最新的提交(commit),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100,例如回退到上一个版本:

git reset HEAD^/commit id
#改变本地HEAD的指针还原到工作区,即已经提交的可以恢复到当前工作区,可以再次修改提交
git reset --hard HEAD^/commit id
#强制移动指针到这个分支,会销毁它前面的所有的信息,本地也没有了,即不可恢复到工作区进行修改了

注意:
1).新建的文件和目录,且从未提交至版本库,此类文件的状态为Untracked files,删除方法如下:

git clean -n    # 将显示哪些未被追踪的文件和文件夹可以清理
git clean -d    # 清理未被追踪的文件夹
git clean -f    # 清理未被追踪的文件(clean.requireForce=false可不加-f选项)
git clean -df . # 其中的.表示当前目录及所有子目录中的文件,也可以直接指定对应的文件路径

2)提交过版本库,但未提交至暂存区的文件(未执行git add),此类文件的状态为Changes not staged for commit,撤销方法:

git checkout . #其中的.表示当前目录及所有子目录中的文件,也可以直接指定对应的文件路径

恢复到某个版本

git reflog用来记录每一次操作的命令,记录着每次操作的commit_id
如果回退到某个版本:

git reset --hard <commit id>
git revert <commit id>

忽略已跟踪文件的改动

有时需让git忽略某个文件的更新,比如配置文件

git update-index --assume-unchanged /path/to/filgit old-branchese #忽略跟踪
git update-index --no-assume-unchanged /path/to/file  #恢复跟踪

Git补丁管理(方便在多台机器上开发同步时用)

生成补丁:

git diff > ../sync.patch

打补丁:

git apply ../sync.patch

测试补丁能否成功:

git apply --check  ../sync.patch

注意:在相同分支下操作

Pull 远程分支

Pull 远程分支是指,取回远程服务器上某个分支的更新,再与本地的指定分支合并。其格式为:

git pull <远程主机名> <远程分支名>:<本地分支名>

例如:取回 origin 主机的 dev 分支,与本地的 master 分支合并

git pull origin dev:master

如果远程分支是与当前分支合并,则冒号后面的部分可以省略:

git pull origin dev

如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,
由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。但是,你可以改变这个行为,加上参数-p
就会在本地删除远程已经删除的分支。

git pull -p

Git push到多个远程库

git remote add origin git@github.com:looly/hutool.git #远程仓库1
git remote add osc git@git.oschina.net:loolly/hutool.git #远程仓库2
git add . 
git commit -m 'First commit' 
git push origin master
git push osc master

git remote rm   [alias]      #删除一个别名,eg:origin osc
git remote rename [old-alias] [new-alias] #重命名,eg:git remote rename osc test
git remote show [主机名] #加上主机名,可以查看该主机的详细信息

远程url切换

git remote set-url origin <URL> #origin是可以替换的

在已忽略文件夹中不忽略指定文件夹,例如:

themes/*
!themes/jacman/

注意点:

  • 空行不匹配任何内容,所以可以作为块分隔符;
  • # 开头表示注释,如果相匹配 #,可以在前面加一个反斜杠,即 \#
  • 除非加了反斜杠,否则一连串的空格会被忽略;
  • 如果在匹配的内容前面加上 ! ,则这些匹配过的部分将被移出,如果要匹配以 ! 开头的内容,需要加上反斜杠,如 \!important.txt
  • 如果一个匹配 pattern 后面有一个斜杠,如 foo/,则默认会匹配所有(包含父子文件夹)中的 foo 文件夹内容
  • 如果一个匹配 pattern 不包含斜杠,如 foo,Git 会将其作为一个 shell 的查找命令匹配内容

需要注意的 **:

  • 如果一个 pattern 以 ** 开头,如 **/foo,最后会匹配所有文件夹下的 foo 文件(夹);
  • 如果一个 pattern 以 /** 结尾,如 abc/**,则表示匹配 abc 目录下的所有内容;
  • 如果一个 pattern 中间包含 **,如 a/**/b,则会匹配 a/b、a/x/b、a/x/y/b 以及所有类似的内容,即匹配任意中间目录。

Git查看、删除、重命名tag

创建tag:

git tag <tagname> 或者 git tag -a <tagname> -m "create tag desc"

把本地tag推送到远程:

git push --tags

获取远程tag

git fetch origin tag <tagname>

删除tag:

git tag -d <tagname>   #删除本地tag
git push origin --delete tag <tagname> #删除远程tag
git push origin :refs/tags/<tagname>  #删除远tag

用diff来检查改动

git diff

比较分支和版本

比较两个分支,或是两个特定项目版本。来让我们看看在 “jason” 分支的哪些改动并不存在于“master”上:

git diff master..jason

这些比较信息仅仅是在分支层面上的,你也可以比较任意的两个项目版本之间的内容:

git diff 0023cdd..fcd6199

Git支持四种数据传输协议,四种传输协议各自的优势和不足

传输协议 优势 缺点
本地传输 1. 远程仓库部署在本地目录,Git client-server之间的数据通信类似本地文件的复制剪切,数据的通信速度较快;2.资源的权限沿用本地操作系统的文件权限和网络访问权限,不需要单独配置。 1.由于远程仓库在本地目录,资源毁灭性丢失的危险性增大。
ssh协议(安全外壳传输协议ssh://) 1.服务搭建相对较简单;2.基于公钥私钥对的方式进行加密授权数据传输;3.同时支持数据的读和写操作。 1.不支持匿名访问,必须通过ssh访问主机才能读写仓库。
Git协议(git://) 1.自身携带的传输协议,传输速度最快的协议;2.使用类似ssh相同的数据传输机制,但取消了加密解密的开销。 1.没有授权机制,要么所有客户端都可读,要么所有客户端都可写,不能根据情况选择性配置读写权限;2.服务搭建相对较复杂。
http/https协议(超文本传输协议) 1.服务搭建相对较简单,基于Apache等web容器就可以实现;2.授权机制简单,能够访问Git仓库所在服务器的web服务的人都可以获取远程仓库资源。 1. 数据通信网络开销较大;2. 执行写操作需要基于ssh协议。

常见解决问题方案

1.git add添加要提交的文件的时候,如果文件名是中文,会显示形如274\232\350\256\256\346\200\273\347\273\223.png 的乱码,core.quotepath设为false的话,就不会对0x80以上的字符进行quote,中文显示正常。有两种解决方案:
1)利用git命令配置core.quotepath为false

git config --global core.quotepath false

2)修改 ~/.gitconfig,找到 [core] 的位置後面,加上:

[core]
    quotepath = false

附:相关资料

轻轻的我走了,正如我轻轻的来