Git快速查找笔记
Git快速查找笔记
起步
三个配置文件
git config --system
:文件位置/etc/gitconfig
,系统级配置
git config --global
:文件位置~/.gitconfig
或 ~/.config/git/config
文件,当前用户配置
.git/config
:文件位置仓库.git/config
,当前仓库配置
用户信息配置
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
查看配置
git config --list
:列出所有 Git 当时能找到的配置
获取帮助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
基础
获取Git仓库
- 方式1,初始化现有目录:
git init
- 方式2,克隆线上的仓库:
git clone https://github.com/libgit2/libgit2
记录每次更新到仓库
Git文件生命周期图:
检查当前文件状态:
git status
状态简览:
git status -s
或者git status --short
新添加的未跟踪文件前面有
??
标记,新添加到暂存区中的文件前面有A
标记,修改过的文件前面有M
标记。 你可能注意到了M
有两个可以出现的位置,出现在右边的M
表示该文件被修改了但是还没放入暂存区,出现在靠左边的M
表示该文件被修改了并放入了暂存区。
跟踪新文件:git add filename
git add
命令使用文件或者目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。此命令可用于跟踪新文件,或者把已跟踪文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态。
忽略文件:
通过创建一个名为.gitignore
文件,在其中列出要忽略的文件模式。
通常需要忽略的文件,包括日志文件、编译过程中的临时文件等,这些无需纳入Git管理,因此可以通过.gitignore
来让他们不出现在未跟踪文件列表。
.gitignore
文件内容的格式规范:
- 所有空行或者以
#
开头的行都会被 Git 忽略。 - 可以使用标准的 glob 模式匹配。
- 匹配模式可以以(
/
)开头防止递归。 - 匹配模式可以以(
/
)结尾指定目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(
!
)取反。
查看已暂存和未暂存的修改:
查看未暂存文件的修改,不加参数直接输入git diff
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。
查看已暂存文件的修改,使用git diff --cached
或者git diff --staged
提交更新:
git commit
会打开一个命令行编辑器,供输入提交信息,通常是vim或emacs
git commit -m "commit message"
将提交信息和命令放在一行
跳过使用暂存区域:
git commit -a -m "commit message"
使用
-a
参数,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add
步骤
移除文件:
git rm filename
从版本管理中删除文件
git rm -f filename
用于删除之前修改过并已放到暂存区域的文件
git rm --cached filename
用于从Git仓库中删除文件,但仍然保留在当前工作目录中。
移动文件:
git mv file_from file_to
查看提交历史
查看提交历史:
git log
用于查看提交的历史,显示提交的SHA-1校验和、作者、邮箱、提交说明
git log -p -2
显示最近2次的提交历史,并显示修改的差异对比
git log --stat
显示提交的简略统计信息
--stat
选项在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了
git log --pretty=oneline
格式化显示提交信息,一行显示
还有
short
,full
和fuller
可以用
git log --pretty=format:"%h - %an, %ar : %s"
格式化输出,支持携带参数
git log --pretty=format:"%h %s" --graph
添加了一些ASCII字符串来形象地展示你的分支、合并历史
git log
常用的选项:
限制输出长度:
git log --since=2.weeks
列出所有最近两周内的提交
git log -Sfunction_name
添加或移除了某一个特定函数的引用的提交
git log -- pathname
列出某些文件或者目录的历史提交
如果只关心某些文件或者目录的历史提交,可以在 git log 选项的最后指定它们的路径。 因为是放在最后位置上的选项,所以用两个短划线(—)隔开之前的选项和后面限定的路径名。
限制git log
输出的选项:
样例:
git log --since="2014-02-12T16:36:00-07:00"
撤销操作
撤销操作:
git commit --amend
提交完再次提交修改漏掉了几个文件没有添加,或者提交信息写错的问题
取消暂存的文件:
git reset HEAD filename
撤销对文件的修改:
git checkout -- filename
远程仓库的使用
远程仓库
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。
查看远程仓库
git remote
查看远程仓库的简写
git remote -v
显示远程仓库读写及对应的URL
添加远程仓库
git remote add <shortname> <url>
添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写
从远程仓库抓取和拉取
git fetch [remote-name]
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
git pull
自动的抓取然后合并远程分支到当前分支
推送到远程仓库
git push origin master
将 master 分支推送到 origin
服务器,要有远程仓库的写权限
当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。
查看远程仓库
git remote show [remote-name]
查看某一个远程仓库的更多信息
远程仓库的移除与重命名
git remote rename oldname newname
改一个远程仓库的简写名
git remote rm [remote-name]
移除一个远程仓库
打标签
列出标签
git tag
列出已有标签
git tag -l 'v1.8.5.*'
支持筛选部分标签显示
创建标签 两种标签类型:轻量标签(lightweight)和附注标签(annotated)
一个轻量标签很像一个不会改变的分支 - 它只是一个特定提交的引用。
附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签,这样你可以拥有以上所有信息;但是如果你只是想用一个临时的标签,或者因为某些原因不想要保存那些信息,轻量标签也是可用的。
附注标签
git tag -a v1.4 -m 'my version 1.4'
通过-a
指定附注标签,-m
指定存储在标签中的信息
git show v1.4
可查看标签信息与对应的提交信息
轻量标签
git tag v1.4-lw
不需要使用选项直接提供标签名即可,轻量标签没有保存任何信息
后期打标签
git tag -a v1.2 9fceb02
通过在命令的末尾指定提交的校验和
共享标签
git push origin [tagname]
显示推送标签到共享服务器
git push origin --tags
将所有不在远程仓库的服务器上的标签全部传送过去
检出标签
git checkout -b [branchname] [tagname]
在特定分支上创建一个新的分支
在 Git 中你并不能真的检出一个标签,因为它们并不能像分支一样来回移动。
Git 别名
Git 并不会在你输入部分命令时自动推断出你想要的命令。 如果不想每次都输入完整的 Git 命令,可以通过 git config
文件来轻松地为每一个命令设置一个别名。
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
设定别名的思路
$ git config --global alias.unstage 'reset HEAD --'
设定一个取消暂存的别名
git config --global alias.last 'log -1 HEAD'
设定查看最后一次提交的别名
执行外部命令的别名
$ git config --global alias.visual '!gitk'
分支
分支简介
Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 分支简介参考
分支创建
git branch [branch-name]
创建一个分支,也就是创建了一个可以移动的新的指针
git log --oneline --decorate
查看各个分支当前所指的对象
分支切换
git checkout [branch-name]
切换到一个已存在的分支
分支切换会改变你工作目录中的文件 在切换分支时,一定要注意你工作目录里的文件会被改变。 如果是切换到一个较旧的分支,你的工作目录会恢复到该分支最后一次提交时的样子。 如果 Git 不能干净利落地完成这个任务,它将禁止切换分支。
git log --oneline --decorate --graph --all
查看分叉历史,会输出提交历史、各个分支的指向及项目的分支分叉情况
分支切换的原理:
由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。 创建一个新分支就相当于往一个文件中写入 41 个字节(40 个字符和 1 个换行符) 这些高效的特性使得 Git 鼓励开发人员频繁地创建和使用分支。
分支的新建和合并
新建分支
git checkout -b [branch-name]
: 创建新的分支并切换到该分支,这条命令相对于以下两条命令
git branch [branch-name]
git checkout [branch-name]
合并分支
git merge [branch-name]
合并[branch-name]
分支的改动到当前所在分支
删除分支
git branch -d [branch-name]
删除分支[branch-name]
遇到冲突时的分支合并 出现冲突时,需要手动解决合并产生的冲突
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
这表示
HEAD
所指示的版本(也就是你的master
分支所在的位置,因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分(=======
的上半部分),而iss53
分支所指示的版本在=======
的下半部分。 为了解决冲突,你必须选择使用由=======
分割的两部分中的一个,或者你也可以自行合并这些内容。
在你解决了所有文件里的冲突之后,对每个文件使用
git add
命令来将其标记为冲突已解决。 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。使用git commit
进行提交即可。
分支管理
查看分支列表
git branch
查看分支列表
git branch -v
查看每一个分支的最后一次提交
git branch --merged
查看哪些分支已经合并到当前分支
git branch --no-merged
查看所有包含未合并工作的分支
git branch -D [branch-name]
强制删除分支
分支开发工作流
长期分支
master
、develop
、next
分支并行开发,master
分支保留完全稳定的代码,其他分支作为后续开发或者测试稳定性。
项目庞大或者复杂时,可以考虑增proposed
或者pu:proposed updates
分支,包含一些不成熟的内容不能进入next
或master
分支的内容。
分支工作流
特性分支
特性分支对任何规模的项目都适用。 特性分支是一种短期分支,它被用来实现单一特性或其相关工作。
远程分支
远程分支
远程引用是对远程仓库的引用(指针),包括分支、标签等等。
git ls-remote
查看远程分支完整列表
git remote add [branch-name] [remote-branch-url]
添加一个新的远程仓库引用到当前项目
git fetch [branch-name]
抓取远程仓库的数据
推送
git push origin [branch-name]
避免每次输入密码
如果不想在每一次推送时都输入用户名与密码,你可以设置一个 “credential cache”。 最简单的方式就是将其保存在内存中几分钟,可以简单地运行 git config —global credential.helper cache 来设置它。
从远程分支拉取新分支
git checkout -b [branch] [remotename]/[branch]
跟踪分支
git checkout --track [remotename]/[branch]
git checkout -b [branch] [remotename]/[branch]
git branch -u [remotename]/[branch]
git branch --set-upstream-to [remotename]/[branch]
设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支,你可以在任意时间使用 -u 或 —set-upstream-to 选项运行 git branch 来显式地设置。
git branch -vv
列出本地分支所有的跟踪分支信息
git fetch --all; git branch -vv
拉取所有远程仓库数据,并查看跟踪信息
拉取
git fetch
命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并。
git pull
是一个 git fetch 紧接着一个 git merge 命令。
删除远程分支
git push [remote] --delete [branch]
删除远程的分支
变基
在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase。
变基概念
你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。
变基操作
git check [branch-a]
git rebase [branch-b]
git checkout [branch-b]
git merge [branch-a]
变基的风险
不要对在你的仓库外有副本的分支执行变基。
使用变基和合并的原则
总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。
服务器上的Git
协议
- 本地协议
- Http协议
- ssh协议
- git协议
在服务器上搭建Git
创建裸仓库
git clone --bare my_project my_project.git
将裸仓库放到服务器上
scp -r my_project.git user@git.example.com:/opt/git
添加写权限
ssh user@git.example.com
cd /opt/git/my_project.git
git init --bare --shared
用户权限控制
- 单独创建系统账号
- 使用一个git账号,并添加ssh公钥进行配置
- 使用LDAP服务
工具
- Gitweb
- GitLab
- Github等服务
分布式
分布式工作流程
- 集成管理者工作流
- 司令官与副官工作流