这篇笔记是为了学习Git知识而收集总结的,主要是看受一篇帖子《你可能不知道的15条Git命令》的影响,才想记录这篇笔记的,若有雷同,纯属巧合。html
Git 是一个分布式版本控制软件, 最初目的是为更好地管理Linux
内核开发而设计。来源:维基百科 - Gitgit
Git
是一个软件,它容许你经过提交对一个系统(或一组)文件的历史进行注释。这些提交即是在给定时间点对系统作出的差别“快照”。github
官网下载速度慢,可以使用这个连接下载 或者Github
下载地址, 须要其余版本请提issue
联系我。shell
Git
配置--system #系统级别 --global #用户全局 --local #单独一个项目 git config --global user.name "xxxx" #用户名 git config --global user.email "xxxx@xxx.com" #邮箱 git config --list # 列举全部配置
链接远程仓库github
数据库
建立SSH Key
缓存
ssh-keygen -t rsa -C <youremail@example.com>
GitHub
,打开Account settings
-> SSH Keys
-> Add SSH Key
,填上任意Title
,在Key
文本框里粘贴id_rsa.pub
文件的内容测试是否链接服务器
ssh git@github.com
几个概念:网络
工做区(Working Directory)
: 你在电脑里能看到的目录。app
暂存区(stage / index)
: 保存了下次将提交的文件列表信息, 通常存放在 .git
目录下 下的index
文件(.git/index)
中,因此咱们把暂存区有时也叫做索引(index)
。ssh
版本库(Repository)
: 工做区有一个隐藏目录.git
,这个不算工做区,而是Git
的版本库。
远程仓库(Remote)
阮一峰老师对Git工做区、暂存区、版本库、远程仓库的解释
Runoob对Git工做区、暂存区、版本库、远程仓库的解释
忽略文件配置:添加.gitignore
文件
文件 .gitignore
的格式规范以下:
#
开头的行都会被 Git 忽略。/
)开头防止递归。/
)结尾指定目录。!
)取反。版本库又名仓库,英文名repository
,你能够简单理解成一个目录,这个目录里面的全部文件均可以被Git
管理起来,每一个文件的修改、删除,Git
都能跟踪,以便任什么时候刻均可以追踪历史,或者在未来某个时刻能够“还原”。
git clone url # clone远程仓库 git init # 初始化本地版本库
Git
分支master
: 默认开发分支
HEAD
: 当前开发分支
HEAD^([n])
: HEAD
的第n
次父提交提交, ^
至关于^1
HEAD~([n])
: HEAD
的第n
个祖先提交
origin
: 默认远程版本库
graph TD; br1_c1-->master*; br2_c2-->master*; br3_c3-->master*; br1_c1_c1-->br1_c1; br2_c2_c2-->br2_c2; br3_c3_c3-->br3_c3;
master
: master
分支
*
: HEAD
,当前活跃(开发)分支
br1_c1
: br1
分支的提交第一次提交
br1_c1_c1
: br1_c1
的第一次提交
如何区分`^`和`~`? 据上图示知,当前开发分支是`master`,即`HEAD`指向`master`, `c1`, `c2`, `c3`是`master`的三次父提交 `HEAD^ -> c1`,`HEAD^2 -> c2`,`HEAD^3 -> c3`, `HEAD~ -> c1`,`HEAD~2 -> c1_c1`
git branch # 查看分支 git branch -r #查看远程分支 # 此命令将显示包含特定提交的全部分支。 git branch --contains <commit> git branch <name> # 建立分支 git checkout <name> # 切换分支 git checkout -b <name> # 建立 + 切换分支 # 重命名本地分支 git branch -m <old-name> <new-name> # 重命名刚切换的新分支 git branch -m <new-name> # 重命名远程分支: 一旦在本地重命名了分支,您须要先远程删除该分支,而后再次推送重命名的分支。 git push origin :<old-name> git push origin <new-name> git merge <name> # 合并某分支到当前分支 git branch -d <name> # 删除分支 git branch -D <name> # 强制删除分支 # 删除远程分支(先在本地删除该分支),原理是把一个空分支push到server上,至关于删除该分支。 git push origin :<name>
Note
: checkout
只会移动HEAD
指针,reset
会改变HEAD
的引用值
git status # 查看状态 git diff <filename> # 查看修改内容 git diff <first_branch>..<second_branch> # 显示两次提交之间的差别 git diff --shortstat "@{n day ago}" # 显示n天的代码数量 git diff --cached(--staged) # 查看已经暂存起来的变化 git show <commit>:<filename> # 显示某次提交时,某个文件的内容 git show <commit> # 显示某次提交的元数据和内容变化 git show --name-only <commit> # 显示某次提交发生变化的文件 git reflog # 显示当前分支的最近几回提交 git blame <filename> # 显示指定文件修改信息
git add <filename>|<div> # 添加指定文件, 指定目录(包括子目录)到暂存区 git add . # 添加当前目录的全部文件到暂存区 # -p(或-patch)容许交互选择要提交的每一个跟踪文件的各个部分。 这样每一个提交只包含相关的更改。 git add -p git mv <old-name> <new-name> # 文件更名 git rm --cached <file> # 中止追踪指定文件,但该文件会保留在工做区 git rm -f <filename> # 强制删除选项 -f
git commit -m 'message' # 提交版本库 git commit -a -m 'message' # 添加全部修改文件到暂存区,并提交版本库(不包括新增文件) git commit --amend -m # 修改最后一次提交,若是代码没有任何新变化,则用来改写上一次commit的提交信息
git reset --hard HEAD # 撤销工做目录中暂存的全部未提交文件的修改内容 git reset --keep [commit] # 重置当前HEAD为指定commit,但保持暂存区和工做区不变 git reset [file] # 重置暂存区的指定文件,与上一次commit保持一致,但工做区不变 git commit --amend # 将暂存区中的文件提交 git checkout [file] # 恢复暂存区的指定文件到工做区 # --patch还可用于选择性地丢弃每一个被跟踪文件的部分。 git checkout -p # 此命令容许您快速切换到先前检出的分支。 通常说来 - 是前一个分支的别名。 它也能够与其余命令一块儿使用。 git checkout - # 还原全部本地更改,若是您肯定能够丢弃全部本地更改,则可使用。 git checkout . git checkout HEAD <filename> # 取消指定未提交文件的修改内容 git checkout --patch <filename> # 撤消对文件的修改 git revert <commit_id> # 撤销指定提交
-p
: 显示每次提交的内容差别。
—stat
: 显示每次更新的文件修改统计信息。
—shortstat
: 只显示 —stat
中最后的行数修改添加移除统计。
--name-only
仅在提交信息后显示已修改的文件清单。
--name-status
显示新增、修改、删除的文件清单。
--abbrev-commit
: 仅显示 SHA-1
的前几个字符,而非全部的 40 个字符。
--relative-date
: 使用较短的相对时间显示(好比,2 weeks ago
)。
--graph
: 显示 ASCII
图形表示的分支合并历史。
—pretty=(oneline,short,medium(默认值),full,fuller,email,raw,format)
: 这个选项能够指定使用不一样于默认格式的方式展现提交历史。 这个选项有一些内建的子选项供你使用。
- `oneline`: 将每一个提交放在一行显示,查看的提交数很大时很是有用。 - [`format`](https://git-scm.com/book/zh/v2/Git-基础-查看提交历史#rpretty_format): 列出了经常使用的格式占位符写法及其表明的意义。
—oneline
: --pretty=oneline --abbrev-commit
的简化用法。
--date= (relative|local|default|iso|rfc|short|raw)
:定制出现日期格式。
-n
: 仅显示最近的 n 条提交
—since
, —after
: 仅显示指定时间以后的提交
--until
, —before
: 仅显示指定做者相关的提交。
—author
: 仅显示指定提交者相关的提交。
—grep
: 仅显示含指定关键字的提交
-S
: 仅显示添加或移除了某个关键字的提交
默认不用任何参数的话,git log
会按提交时间列出全部的更新,最近的更新排在最上面。
git log # 查看全部提交历史 git log -p -n # 查看最近提交的n条历史 git log -p -n <filename> # 查看指定文件最近提交的n条历史
git log alias
配置
git log --pretty=format:'%s %C(bold blue)(%an)%Creset' --abbrev-commit git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit # 设置git alias git config --global alias.slg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 显示每一个提交在过去两周内引入的差别日志。 git whatchanged —-since='2 weeks ago'
Git
能够给历史中的某一个提交打上标签,以示重要。
Git
使用两种主要类型的标签:轻量标签(lightweight)
与附注标签(annotated)
。
轻量标签: 很像一个不会改变的分支 - 它只是一个特定提交的引用。它本质上是将提交校验和存储到一个文件中 - 没有保存任何其余信息。
附注标签是存储在 Git
数据库中的一个完整对象。 它们是能够被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;而且可使用 GNU Privacy Guard(GPG)
签名与验证。 一般建议建立附注标签,这样你能够拥有以上全部信息;可是若是你只是想用一个临时的标签,或者由于某些缘由不想要保存那些信息,轻量标签也是可用的。
-a
: 建立附注标签
-m
选项指定了一条将会存储在标签中的信息。 若是没有为附注标签指定一条信息,Git
会运行编辑器要求你输入信息。
git tag # 列出已有的标签 git tag <tagname> # 建立标签,-a 建立附注标签 git tag -d <tagname> # 删除掉你本地仓库上的标签 git show <tagname> # 查看标签信息与对应的提交信息 git push origin <tagname> # 推送标签到远程仓库服务器上 git push origin --tags # 一次性推送全部不在远程仓库服务器上的标签
merge
: 用来合并一个或者多个分支到你已经检出的分支中, 而后它将当前分支指针移动到合并结果上,现有分支不会被修改。
rebase
: 一般称之为“衍合”,它经过修改提交历史来对比双方的commit
,而后找出不一样的去缓存,而后在去push
,修改你的commit
历史。
cherry-pick
: 用于将在其余分支上的 commit 修改,移植到当前的分支(HEAD), -x
参数,表示保留原提交的做者信息进行提交。
git merge <branch> # 合并指定分支到当前分支 git rebase <branch> # 衍合指定分支到当前分支 # 用于将在其余分支上的 commit 修改,移植到当前的分支(HEAD), <start-commit-id>…<end-commit-id>左开右闭,<start-commit-id>^…<end-commit-id>全闭 git cherry-pick <start-commit-id>…<end-commit-id>
当你在项目的一部分上已经工做一段时间后,全部东西都进入了混乱的状态,而这时你想要切换到另外一个分支作一点别的事情。 问题是,你不想仅仅由于过会儿回到这一点而为作了一半的工做建立一次提交。
储藏会处理工做目录的脏的状态 - 即,修改的跟踪文件与暂存改动 - 而后将未完成的修改保存到一个栈上,而你能够在任什么时候候从新应用这些改动。
git add . && git stash # 将新的储藏推送到栈上 git stash save 'message' # 储藏修改,并留下stash信息 # -p(或-patch)容许交互选择要提交的每一个跟踪文件的各个部分。 这样每一个提交只包含相关的更改。 git stash -p # 默认状况下,当存储时,不包括未跟踪的文件。 为了更改该行为并包含这些文件,您须要使用-u参数。 还有-a(-all)能够彻底存储未跟踪和忽略的文件,这多是您一般不须要的东西。 git stash -u git stash list # 查看栈中全部暂存 git stash apply <stash_id> # 恢复复对应编号暂存到工做区,若是不指定编号为栈顶的,注意:这些暂存还在栈中 git stash pop <stash_id> #将栈顶的暂存,恢复到工做区,并从栈中弹出,注意:这些暂存不在栈中 git stash drop <stash_id> # 移除的储藏在栈中的东西 git stash clear #清空暂存栈 git stash branch <branch_name> # 从储藏建立一个分支
远程仓库是指托管在因特网或其余网络中的你的项目的版本库。
git remote # 查看已配置的远程仓库服务器 git remote -v # 指定选项 -v,会显示须要读写远程仓库使用的 Git 保存的简写与其对应的 URL。 git remote show <remote-name> # 查看制定远程仓库的更多信息 git remote add <shortname> <url> # 添加一个新的远程 Git 仓库 git remote rm <name> # 移除远程仓库 git remote rename <oldname> <newname># 重命名远程仓库 git fetch <remote-name> # 从远程仓库中拉取数据 # 下载代码及快速合并, 当你想拉取origin服务器上的当前分支名的代码时,可简写git pull git pull <remote-name> <branch-name> # 第一次推送到远程仓库,--set-upstream可简写为-u git push --set-upstream <remote-name> <branch-name> # 推送到远程仓库, 当你想将当前开发分支名推送到 origin 服务器,可简写为git push git push <remote> <branch-name> git push [remote] --force # 强行推送当前分支到远程仓库,即便有冲突 git push [remote] --all # 推送全部分支到远程仓库 git push <remote> :<branch-name/tag-name> # 删除远程分支或标签 git push --tag # 上传全部标签
# 一次打开全部冲突的文件,从新绑定可能会致使冲突,如下命令将打开须要您帮助解决这些冲突的全部文件。 git diff --name-only --diff-filter=U | uniq | xargs $EDITOR
GitHub
远程仓库的通常步骤git init git add . git commit -m 'hint message' git remote add origin 'your project repositories href on github' git pull origin master git push -u origin master
首次push
远程仓库提交错误 -> 错误截图解决详见
error: failed to push some refs to 'https://github.com/xxx.git'
# --allow-unrelated-histories 合并了两个不相关的项目的历史记录。 git pull origin master --allow-unrelated-histories git push -u origin master
参考资料
15-git-commands-you-may-not-know
Github
, 知乎,掘金,素质三连击~~