Git 常用命令
安装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来检查改动
比较分支和版本
比较两个分支,或是两个特定项目版本。来让我们看看在 “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
附:相关资料