Git学习总结

Git学习总结

标签(空格分隔): git 总结git

1. 基础 GIT BASICS

1.1 获取Git仓库

  • 在已有目录下初始化仓库
$ cd path #进入目录
$ git init #建立.git目录,含初始化内容

$ git add 文件名 #添加现有文件到暂存区,使用通配符“*”能够将全部文件都添加进去。支持正则表达式匹配
$ git commit -m"提交注解" #把暂存区的文件都提交到本地仓库中去
  • 在空目录下获取远程服务器的仓库
$ git clone URL #获取URL下的仓库,会直接下载到当前目录。若是没有提早配置git帐号信息,会要求验证经过才可下载

$ git clone URL project_new_name #下载远程仓库,而且重命名本地的仓库

也能够经过SSH方式获取远程仓库,如【user@server:path/to/repo.git】正则表达式

1.2 记录更新到本地仓库

  • 查看文件状态
$ git status #文件状态包括“未跟踪”(新建文件就是未跟踪状态)、“暂存”、“新建”、“已编辑更改”。注意看列出的详细解释。

$ git status -s #做用同上。输出会有大概如下的内容:
?? a.txt #“??”表示未跟踪文件
A  b.txt #“A ”已跟踪文件即已添加到暂存区(注意A右边有个空格)
 M c.txt #“ M”已修改但未跟踪(注意M左边有个空格)
M  d.txt #“M ”已修改且已跟踪,被添加到暂存区(注意M右边有个空格)
MM e.txt #已修改且已被跟踪添加到暂存区后,又被修改了,然后面的更改尚未跟踪添加暂存区。若是此时提交commit,则只会提交前一次添加到暂存区的内容,新修改不会被提交。
  • 查看提交历史
$ git log #直接显示全部提交记录,含提交时间和提交者

#其余经常使用的命令
$ git log -p #除了显示提交时间和提交者外,还显示提交的注解内容
$ git log --stat #查看提交的统计数据
$ git log --pretty=oneline #以一行输出提交的信息(部分提交的校验和、提交注解说明)
$ git log --pretty=format:"%H %cn % ce %s" #格式化输出提交历史内容
$ git log -p -n #显示最近n条提交记录
$ git log --author=Jack #显示Jack这个做者(修改文件)相关的记录
$ git log --committer=Jack #显示Jack这个提交者(提交文件)提交的记录
$ git log --before=“2017-12-30” #显示2017-12-30以前提交的记录,“--before”和“--until”同做用
$ git log --after=“2017-12-30” #显示2017-12-30以后提交的记录,“--after”和“--since”同做用
$ git log --grep=“xxx” #显示提交注解内容里和字符串“xxx”相关的提交记录

其中格式化输出参数含义以下:数据库

%H:提交对象(commit)的完整哈希字串
%h:提交对象的简短哈希字串
%T:树对象(tree)的完整哈希字串
%t:树对象的简短哈希字串
%P:父对象(parent)的完整哈希字串
%p:父对象的简短哈希字串
%an:做者(author)的名字
%ae:做者的电子邮件地址
%ad:做者修订日期(能够用 --date= 选项定制格式)
%ar:做者修订日期,按多久之前的方式显示
%cn:提交者(committer)的名字
%ce:提交者的电子邮件地址
%cd:提交日期
%cr:提交日期,按多久之前的方式显示
%s:提交说明
  • 添加文件到暂存区
$ git add 文件 #可将新建的、已更改的文件添加到暂存区,暂存区的内容能够被提交到本地仓库

文件添加到暂存区之后,文件的状态就又未跟踪untracked变为已暂存staged。暂存区其实也只是一个索引文件index,指向相关被跟踪文件。服务器

  • 忽略特殊文件,不添加到暂存区
$ touch .gitignore #在和.git目录同级地方新建.gitignore文件
$ vi .gitinore #添加忽略的文件类型,以下。
#临时的副本文件
*.[oa]
*~

# Eclipse
.classpath
.project
.settings/

# Intellij
.idea/
*.iml
*.iws

# Mac
.DS_Store

# Maven
log/
target/
out/

# Others
bin/
.myeclipse

“*”任意个字符,“**”中间任意目录,“?”一个字符,“[0-9]”匹配数字0到9,“[abc]”匹配其中一个字符。eclipse

  • 比较文件内容变化
$ git diff #不加参数直接执行该命令

git diff比较的是工做目录的文件和暂存区的文件之间的差别,若是同一个文件已经被跟踪添加到了暂存区后又被修改,git diff就会把发生变化的具体内容详细列出来,很好用。ide

  • 提交更新
    在git add命令后把文件添加到了暂存区,接下来就是要把暂存区的文件提交到本地仓库中去。
$ git commit -m"本次提交注解说明"

每一次提交都是对本地项目的一个快照,之后能够回到任何一个快照节点,或者对不一样快照进行对比。工具

为了方便,能够跳过将文件添加到暂存区这一步,直接提交文件到本地仓库。可是前提条件是这些文件都不是新建的,且以前也已经被跟踪过,即文件被git add过放到暂存区了,如今作了更改,此时在提交时添加“-a”参数便可让系统自动添加到暂存区而后一并提交。学习

$ git commit -a -m“本次提交注解说明”

1.3 打标签 tags

能够给历史上任何一次提交打个标签,说明该次提交的重要性,好比版本发布时的提交能够打标签“v1.0”、“v2.3”等。fetch

$ git tag #列出全部的标签
$ git tag -l 'v2.3.*' #正则表达式匹配过滤,仅显示前缀为“v2.3.”的标签,根据本身须要能够更改匹配内容
$ git show 标签名称 #列出和标签相关的提交时的完整信息

$ git tag -a 标签名称 -m"关于标签的描述说明"  #建立一个附注标签,含提交人和时间等完整信息
$ git tag 标签名称 #建立一个轻量标签,和附注标签相比,其不含任何信息,只是标记该次提交,即该次提交的引用别名

若是提交已经完成,想要给过去忘了的地方打上标签,能够先查看获得想要打标签的校验和或部分校验和,而后也能够完成打标签操做,以下:idea

$ git tag -a 标签名 校验和 #在能够区分其余提交的时候检验和也能够只是一部分,如可使用完整的校验和“4682c3261057305bdd616e23b64b0857d832627b”,也可使用前面一部分校验和“4682c32” (须要确保惟一)

使用【git push】命令时默认不会把标签推送到远程仓库,须要显式推送才行。

$ git push [remote_name] [branch_name] 标签名称 #推送一个标签到远程仓库
$ git push [remote_name] [branch_name] --tags #推送本地全部的标签到远程仓库

将本地的标签推送到远程仓库以后,其余人拉取的时候就能够一同把你推送的标签获取下来了。

1.4文件操做

  • 删除
    状况1:想要把文件永久删除,即同时删除磁盘上的和git本地仓库内的文件。
$ rm -f 文件名  # -f表示强制执行。先强制删除磁盘上的文件
$ git -f rm 文件名  # -f表示强制执行。而后强制删除暂存区内的文件,即从跟踪文件列表中删除
$ git commit -m"提交删除文件xxx" #提交暂存区的变化,即把已删除文件删除,再也不归入版本管理中

状况2:想要把文件从git本地仓库删除,可是保留磁盘上的文件。如不当心把很大的log文件添加到git仓库,须要从git仓库中删除而且不要被跟踪,可是磁盘上的日志文件须要保留下来。

$ git rm --cache 文件名  # --cache意思就是删除暂存区内文件
  • 重命名文件
$ git mv file_old_name file_new_name #重命名文件

上面重命名文件的命令,至关于下面三条命令:

$ mv file_old_name file_new_name # 重命名磁盘上工做目录的文件
$ git rm file_old_name # 删除暂存区的文件,即把文件从被跟踪列表删除
$ git add file_new_name #从新添加命名后的文件到暂存区,而且标记被跟踪

注意:git命令中的“mv”并无【移动】文件的功能,不像其余VCS系统或者Linux系统能够移动文件的位置。

1.5 撤销修改 UNDOING CHANGES

  • 反悔了-要从新提交
    要从新修改前一次提交的状况,好比要新建一个文件(新建后添加到暂存区),或要修改前一次提交的注解内容,或者须要增长提交几个文件,就能够执行下面命令:
$ git commit --amend #“撤销”前一次提交,从新完成提交操做,新提交操做会覆盖前一次提交

执行命令后会打开文件修改注解内容,默认是vi的方式。上面的命令能够理解为“撤销”前一次提交,从新完成提交操做,新的提交操做会覆盖前一次提交。

  • 取消暂存的文件
$ git reset HEAD file_name #对文件取消暂存,即取消“git add file_name”的操做。
  • 撤销对磁盘文件的修改
$ git checkout -- file_name

危险!!上面的操做会直接撤销磁盘上该文件的全部修改,会回到上次提交的状态或刚放进工做目录样子。【分支】会很好的帮你处理相似的风险问题。
在Git中任何提交过的东西都几乎能够恢复,可是未提交的内容不会,因此涉及删除、撤销等操做是要格外地注意。

1.6 远程仓库 REMOTE REPOSITORIES

  • 查看本地相关联的远程仓库
$ git remote -v # 查看远程仓库名称和URL
$ git remote show [remote-name]  #查看详细信息
  • 添加远程仓库与本地仓库关联起来
$ git remote add 起个备注别名 远程仓库URL #从此可使用备注别名表明这个远程仓库URL进行操做
  • 拉取远程仓库数据到本地仓库
$ git fetch [远程仓库备注别名(默认origin)或URL] #不会自动合并本地内容
$ git pull [远程仓库备注别名(默认origin)或URL] #会自动合并本地内容

注意git fetch仅仅是拉取远端仓库新的数据,并不会自动合并本地内容,须要手动从此合并,而git pull 则会自动合并。

  • 推送本地仓库到远程仓库
$ git push [remote_name] [branch_name]
  • 远程仓库重命名和移除
$ git remote rename old_name new_name #重命名远程仓库
$ git remote rm remote_name #移除远程仓库

1.7 别名

编辑config配置文件来完成别名的设置。

$ git config --global alias.别名名称 被替代的命令 #被替代的命令若是包含空格须要使用单引号把整个被替代的命令包含起来

举例:

$ git config --global alias.co checkout #设置后“co”等价于“checkout”
$ git config --global alias.br branch #设置后“br”等价于“branch”
$ git config --global alias.ci commit #设置后“ci”等价于“commit”
$ git config --global alias.st status #设置后“st”等价于“status”
$ git config --global alias.unstage 'reset HEAD --' #取消暂存,设置后“unstage”等价于“reset HEAD --”
$ git config --global alias.last 'log -1 HEAD' #使用last别名查看上一次提交记录

2 Git分支模型 GIT BRANCHES

每次提交都是一次完整的项目文件快照(以对象的形式),并不是仅记录变化。每次提交到Git仓库后,都会建立三类对象:blog对象(文件快照对象)、树对象(记录目录结构和blog对象索引)、提交对象(记录提交信息、树对象索引和前一次提交对象/父对象索引)。Git分支,本质上就是仅仅指向提交对象的可变指针。因此建立分支,就只是建立一个可移动的指针。

2.1 分支操做

  • 建立、切换分支
$ git branch 分支名称 #建立分支

HEAD指针指向当前所在分支。建立新分支后,并不会自动切换到新分支上去,须要手动操做。

$ git checkout 分支名称 #切换到新分支,这样后HEAD就会指向切换的分支

若是想要建立分支而且立刻切换过去,可使用下面命令:

$ git checkout -b 新分支名字 #建立分支,而且切换过去
  • 删除分支
$ git branch -d 分支名称 #删除已合并的分支
$ git branch -D 分支名称 #强制删除分支(不论是否合并)
  • 合并分支
$ git merge 分支名字 #要先进入到想要合并到的分支,而后再把其余分支合并进来。能够把“master”合并到小分支上。

两个合并的分支中有一个是直接祖先时,会使用“fast-forward”快进合并,仅仅是把指针移动。若是不是直接祖先关系,公共祖先在更加久远的时刻,这时候要进行三方合并,Git会自动建立合并提交。

冲突解决:当两个不一样的分支对同一个文件的同一个地方作了不一样的修改,合并的时候就会出现冲突。此时须要使用【git status】查看冲突并手动去解决,而后再提交。

  • 分支管理
$ git branch #查看全部分支,仅提示分支名字。当前分支的最前面会有“*”号标记。
$ git branch -v #查看全部分支最近一次提交
$ git branch --merge #查看已经合并到当前分支的全部分支
$ git branch --no-merge #查看尚未合并到当前分支的全部分支

2.2 项目开发分支工做流

项目开发中经常使用分支策略:长期分支、特性分支、远程分支。

  • 长期分支
    保留主分支做为项目稳定版本,使用开发分支进行开发和维护。

  • 特性分支
    主分支是稳定版本,能够根据须要建立特性分支,完成特定的工做内容后能够随时删除。

  • 远程分支
    远程服务器上的分支。
$ git fetch origin #拉取远程服务器上origin仓库的数据到本地,而且更新本地数据库,使本地仓库与远程仓库一致
$ git merge origin/分支 #将从远程仓库拉取下来的内容,合并到当前分支

从一个远程跟踪分支检出一个本地分支,Git会自动建立一个叫作 “跟踪分支”。跟踪分支是本地分支,与远程分支有直接关系。若是在一个跟踪分支上输入git pull,Git 能自动地识别去哪一个服务器上抓取、合并到哪一个分支。

3 重写Git历史 REWRITING GIT HISTORY

建议:不要涉及任何已经推送到中央服务器的内容。

  • 修改最后一次提交
    要从新修改最后一次提交的状况,好比要新建一个文件(新建后添加到暂存区),或要修改前一次提交的注解内容,或者须要增长提交几个文件,就能够执行下面命令:
$ git add/rm 文件  #先进行修改
$ git commit --amend #而后“撤销”前一次提交,从新完成提交操做,新提交操做会覆盖前一次提交

执行上述操做须要注意,若是已经把提交的内容推送到远程服务器上面,就不要修正它(从新在前一次提交后的基础上再提交)。

  • 修改多个提交信息
    经过交互式的变基工具,指定要重写多久远的历史,完成操做。
$ git rebase -i HEAD~n #最后的n是数字,表示要修改最后的n次提交,“-i”为交互式操做。

注意上面的命令是变基操做,若是提交已经推送到服务器就不要执行,要保证全部内容都是在本地且还没有推送,不要涉及任何已经推送到中央服务器的提交(会出现一次变动的两个版本)。
执行上面命令后,根据提示输入相应的命令来完成修改。

  • 修改提交顺序
    命令和前一小节同样。
$ git rebase -i HEAD~n #最后的n是数字,表示要修改最后的n次提交,“-i”为交互式操做。

在打开的修改文件中,直接修改相应的提交顺序便可,还能够直接删除某个提交,当你完成操做保存文件的时候,所作的修改就会生效。
执行上面命令后,根据提示输入相应的命令来完成修改。

  • 压缩合并提交
    命令和前一小节同样。
$ git rebase -i HEAD~n #最后的n是数字,表示要修改最后的n次提交,“-i”为交互式操做。

第一行的命令关键字使用“pick”,其余行使用“squash”替代“pick”能够将全部的提交压缩到第一个提交来完成。
执行上面命令后,根据提示输入相应的命令来完成修改。

  • 拆分提交
    把一次提交拆分得更细,分几回来提交完成。
$ git rebase -i HEAD~n #最后的n是数字,表示要修改最后的n次提交,“-i”为交互式操做。

执行上面命令后,进入提交文件进行修改,要拆分的那个提交的“pick”命令改为“edit”,而后进行修改及add/commit操做,完成时运行“git rebase --continue”继续。

  • 修改因此提交历史 “git filter-branch ”命令能够经过脚本的方式修改历史上大量的提交(危险操做!!慎重!)。能够从历史上全部提交中移除文件、让子目录做为新的根目录、全局修改邮箱地址等。
相关文章
相关标签/搜索