本文主要介绍git常用命令的使用方法,同时介绍一些常见问题的处理方法,持续更新中…
大多数git命令都适用的选项列表如下:
-v, --verbose show hash and subject, give twice for upstream branch
-q, --quiet suppress informational messages
-t, --track set up tracking mode (see git-pull(1))
--set-upstream change upstream info
-u, --set-upstream-to change the upstream info
--unset-upstream Unset the upstream info
--color[=] use colored output
-r, --remotes act on remote-tracking branches
--contains print only branches that contain the commit
--abbrev[=] use digits to display SHA-1s
使用方式如下,其中command_name 具体使用的时候替换成要查询的命令名。
git help
git help 命令的输出结构(以输入git help help为例):
NAME(命令名称)
git-help - 显示git有关的帮助信息
SYNOPSIS(梗概)(相同的option选项会放在同一个[]中,许多命令提供了简写形式)
git help [-a|--all] [-g|--guide] [-i|--info|-m|--man|-w|--web] [COMMAND|GUIDE]
DESCRIPTION(描述)
help命令使用的一些描述(包括如何使用、使用注意事项以及如何能最高效的得到你想要的结果)
OPTION(选项)
对具体的option选项(即SYNOPSIS中中括号展示出来的选项)具体的解释
CONFIGURATION VARIABLES
关于该命令的可选配置(即该命令在.gitconfig文件中可以进行的一些配置操作)
首次使用,可以输入git help,该命令会展示一些使用git的总体帮助信息,展示如下:
git命令使用的不同场景:
创建一个git工作区 (万里长征的第一步)
clone 克隆分支
init 创建一个新的git仓库或者重新初始化一个已经存在的git仓库(放心,在一个已经存在的git仓库中执行git init命令是安全的,执行该命令的主要原因是为了快速挑选出新近添加的模版或者使用惊醒仓库移动)
针对当前分支的操作 (详情请看:git help everyday)
add 将文件添加到git的索引中(方便提交)
mv 将文件(目录等)进行移动或重命名
reset 将当前分支的HEAD(最新提交)Reset到指定的commit
rm 将文件从工作树和工作索引中移除
检查历史及状态的相关命令(详情请看: git help revisions)
bisect Find by binary search the change that introduced a bug
grep Print lines matching a pattern
log Show commit logs
show Show various types of objects
status Show the working tree status
grow, mark and tweak your common history
branch 查询、创建或删除分支
checkout 切换分支或者恢复当前工作区的文件
commit 将更改记录到仓库,及本地提交
diff 比较不同提交(分支和工作目录)之间的差异等
merge 将开发记录合并
rebase 将本地提交放在提交记录的顶部(及记录栈栈顶)具体可查看git rebase 中的示例
tag 创建、查询、删除或核对一个用GPG协议签名的Tag
collaborate (see also: git help workflows)
fetch 拉取更新,不合并
pull 拉取更新并合并
push 推送更新到相关分支
git help -a 列出所有git命令(方便查看有哪些git命令)
git help -g 列出所有概念性的指导(很有用)
git add支持以通配符形式的添加文件
git add . 添加当前目录所有改变(修改、删除、新增)的文件信息到索引库(常用)
git add -u . 添加当前目录所有修改、删除的文件信息到索引库,不处理untracked文件
git add -A . 添加当前目录所有修改、删除的文件信息导索引库,并将untracked文件添加到索引库
git add -i . 交互式添加当目录所有修改、删除、新增的文件信息到索引库
git add -i . 输入之后,会进入一个子命令系统,会列出当前工作目录所有tracked和untracked的文件信息,同时会在下方列出以下八个子命令:
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
这八个子命令都是见名知意的,使用方式都是输入相应子命令后,列出带序号的文件列表,选择要操作的文件序号(可多选),执行命令,显示命令结果,之后按回车键,返回子命令系统目录。
首次使用git push命令(即直接输入git push),git 会提示设置set upstream,其实就是让你设置本地分支同远程分支见的对应关系,建立跟踪关系的方法:
建立分支时采用 —track,如:
git branch --track local_branch origin/remote_branch_name
执行之后,本地分支local_branch 和 远程分支remote_branch_name间就建立了跟踪关系
使用—set-upstream(相当于修改项目根目录.get文件夹下的config文件),如:
git branch --set-upstream test_branch origin/test_branch
push操作时使用—set-upstream,如:
git push origin --set-upstream test_bransh:origin/test_branch
push命令具体分析:
git push -u origin local_branch:remote_branch
推送成功后,local_branch和remote_branch间就存在对应关系了;
git push --prune(中文意思裁剪)
推送之后,如果本地分支不存在了,同名的远程分支也将被删除
git push -n
模拟推送,除了真正的将更新推送过去这件事不干外,其他push会发生的操作都进行了
git push --delete remote_branch_name
删除远程分支remote_branch_name(效果同git push origin :remote_branch_name)
git push --all
推送所有分支
git push --quiet
推送之后不现实输出结果,除非发生了错误
git push --progress
推送之后显示推送进度
push命令的一些便捷操作:
git push
将当前的分支推送到关联的远程分支,没有的话git会予以提示;
git push origin
同上,没有的话会报错
git push origin :
将当前的分支推送到匹配的远程分支
git push origin master
将master分支推送到远程的master分支,如果远程没有,则会创建相同名称的远程分支
git push origin HEAD
将当前分支推送到相同名车个的远程分支
git merge 操作需要操作着熟悉vim编辑器,由于自己使用的较少,顾不做描述,建议采用GUI环境来进行Merge操作(通常就是解决冲突)
待我熟悉了vim,我会不全的。
git checkout origin/remote_branch_name,运行该命令会处于HEAD Detached状态,原因是HEAD不能指向远程分支,它只能指向本地的某个commit或者本地分支。当"git checkout 远程分支",而本地又没有这个分支,HEAD就会直接指向远程分支指向的commit了,HEAD指向commit就会进入detached HEAD state。这个以后只要运行以下命令即可:
git checkout -b 分支名// 运行完之后,在利用git push将新建的本地分支和上面的分支
// 关联起来即可
首次使用git pull命里该,效果同首次使用git push命令相同。在默认的git pull选项中,该命令相当于执行以下命令组:
git fetch remote
git merge FETCH_HEAD
使用git pull —rebase时,相当于执行以下命令组:
git fetch remote
git rebase
git pull具体分析
pull命令本身只有三个option选项(-q, -v, —[no-]recurese-submodules),但由于pull命令是fetch和merge两个命令的组合,使用pull命令时要注意fetch命令和merge命令的一些注意事项。
俗称变基操作,举个栗子来说明(来源于git文档)
Assume the following history exists and the current branch is "topic":
A---B---C topic
/
D---E---F---G master
From this point, the result of either of the following commands:
git rebase master
git rebase master topic
would be:
A'--B'--C' topic
/
D---E---F---G master
我的理解就是,将并行两个commit记录(采用新的commit来)串行处理。
rebase过程中如果存在冲突,先解决冲突,然后采用git add .将更改的文件添加到索引库,在继续rebase操作(无需提交),具体命令如下:
git rebase master
git rebase master topic(或者采用git pull --rebase)
if(conflicts occures) {
First, resolve the conflicts;(实际上就是一些merge操作)
Then, git add .(添加merge修改的文件)
Finally, git rebase --continue
}
变基操作完成。
rebase过程中如果想放弃变基操作,可采用如下命令:
git rebase --abort
该命令会放弃变基,让操纵的回到之前的状态
还有其他选项,会在使用过程中陆续添加
显示提交记录,其选项较多,大多是美化log输出、设置log输出格式、设置log输出范围等
git log --follow
显示特定文件的历史更改记录
git log -g
显示所有的记录(包括丢失的),用来做数据恢复很方便,等同于命令git reflog
git log
显示已定范围的log
git log --merges
显示所有的merge记录
展示、创建或删除分支
git branch
列出所有本地分支
git branch -a
列出所有远程分支和本地分支
git branch -r
列出所有远程分支
git branch -d local_branch_name
删除本地分支(对local_branch_name分支的合并状态有要求,必须完全合并)
git branch -f branch_name
创建分支branch_name,如果branch_name存在,则重置(不使用-f的区别就是如果branch_name存在则重用branch_name分支
git branch -D(shortcut for --delete --force)
删除本地分支(对local_branch_name分支的合并状态无要求,相当于强删)
git branch -m old_branch_name new_branch_name
重命名old_branch_name为new_branch_name(对old_branch_name分支的merge状态有要求)
git branch -M old_branch_name new_branch_name
重命名old_branch_name为new_branch_name(对old_branch_name强行重命名)
git branch --color=[always, never, auto] color_branch_name
高亮显示color_branch_name这个分支
用来配置仓库或全局的配置选项
// git 全局配置命令
该命令用来管理已经跟踪的库,常见用法:
git remote [-v | --verbose]
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
git remote rename <old> <new>
git remote remove <name>
git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
git remote set-branches [--add] <name> <branch>...
git remote get-url [--push] [--all] <name>
git remote set-url [--push] <name> <newurl> [<oldurl>]
git remote set-url --add [--push] <name> <newurl>
git remote set-url --delete [--push] <name> <url>
git remote [-v | --verbose] show [-n] <name>...
git remote prune [-n | --dry-run] <name>...
git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]
git remote add origin https://github.com/Rainmonth/JavaLearn.git
git push -u origin maste
参考文章
// GitHub 对提交的文件大小有限制,要小于 100m,即使使用了上面的 git global
原因是因为git中文默认以\xxx八进制形式展现,会对对0x80以上的字符进行quote,只要将core.quotepath设置为false即可解决问题
git config --global core.quotepath false
前提是存在恢复的可能性,以下情况不能恢复:
丢失的分支或commit信息没有被git gc清除,一般情况下,gc对那些无用的object会保留很长时间后才清除的。
恢复方法,具体步骤如下:
假设已经跟踪的文件为git.txt,执行以下代码即可
git rm --cached
git update-index --assume-unchanged git.txt
git update-index --no-assume-unchanged git.txt
SourceTree