Git
Git的配置信息
使用git config
命令对Git做一些配置。
Git的配置文件等级
Git的配置文件有三个,分别对应不同的影响等级:
-
Linux下
-
/etc/gitconfig
:包含系统上每个用户及他们仓库的通用配置,使用git config --system
更改 -
~/.gitconfig
或~/.config/git/config
:针对当前用户的配置文件,使用git config --global
修改 -
.git/config
:针对当前仓库的配置文件,使用git config
修改
-
-
Windows下
$Git/etc/gitconfig
$HOME/.gitconfig
.git/config
读取配置时优先读取当前仓库的配置,如果没有就往上找
修改Git配置
- 修改全局配置:
git config --global user.name "zhangsan"
查看当前的Git配置
git config --list
Git基础
初始化Git仓库
将当前目录初始化为Git仓库:git init
如果当前目录中已经有一些文件存在,使用git add <filename>
来跟踪某个文件即将其提交到暂存区,或者git add .
跟踪当前目录所有文件并提交到暂存区
克隆已有的仓库
克隆github上某个仓库:git clone <url>
git commit -a
提交所有已修改的文件,不管有没有在暂存区
从git中移除文件
git rm $FILENAME
:要求文件当前没有被暂存,如果被暂存需要添加-f
选项,这样强制删除后无法被Git恢复。也可以添加--chached
选项直接从暂存区移除(不会从磁盘上移除),移除后是untracked
状态
比较差异
文件已修改且未提交到暂存区,与修改前作对比:git diff <filename>
文件已提交到暂存区,与上次提交作对比:git diff --cached
or git diff --staged
移动文件
git mv <src> <dst>
运行一次git mv
命令相当于
mv <src> <dst>
git rm <src>
git add <dst>
查看提交历史
git log [option]
option
-
-p
:显示每次提交的diff -
-n
:显示最近n次提交log -
--oneline
:只显示每次提交的SHA-1和提交信息
提交参数
git commit --amend
:提交暂存区修改,并将上次提交与本次提交合并
取消暂存
git reset HEAD <filename>
:撤销对某文件的暂存操作,变为已修改未暂存状态
恢复到上次提交的状态
git checkout -- <filename>
or git restore <filename>
:丢弃所有修改,将文件恢复到暂存区的状态(如果已暂存未提交),否则恢复到上次提交的状态
Git别名
git config --global alias.co checkout
git别名只是简单的文本替换
Git分支
Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
每次提交更新,Git都会保存所有被跟踪文件的快照并将快照索引保存在本次提交创建的提交对象
中,而不是记录本次修改与上次的差异。提交对象
保存了快照索引、提交信息、父对象等信息。git init
后会自动创建一个master
分支,每次commit
后会创建新的提交对象,master
自动向前移动。
新建分支实质上是创建一个指向当前分支的最后一个提交对象的指针(Git通过一个HEAD指针记录当前所在的分支,并指向最后一次提交的快照,当切换分支时,HEAD指针也随之变动),由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。,创建一个新分支就相当于往一个文件中写入 41 个字节(40 个字符和 1 个换行符)
Git创建分支
git branch <branch_name>
下图展示了执行git branch testing
创建testing
分支的结果。
Git删除分支
git branch -d <branch_name>
如果该分支没有被合并则删除失败,使用-D
强制删除
Git切换分支
git checkout [option] <branch_name>
option
-b
:创建分支后切换到该分支
Git合并分支
将两个分支合并会产生一个新的提交对象。
git merge <branch_name>
:将brance name
合并到当前分支,如果没有文件冲突发生,则合并完成;如果发生文件冲突,Git会提示合并未完成,使用git st
命令查看未merge的文件并手动修改,未merge的文件分为上下两部分,用======
分割,手动选择要保存的内容并删除>>>>>>>
、=======
、<<<<<<<<<<
后执行git add <filename>
和git commit
后自动完成合并
git branch --merged
:查看已合并到当前分支的分支
git branch --no-merged
:查看所有未合并工作的分支
如果要合并的分支与当前分支在一条大分支上,也就是当前分支落后于要合并的分支,那么只需要将当前分支的指针快进即可。
接下来将iss53
分支合并到master
分支上:
git checkout master
git merge iss53
Git查看所有分支
git branch [option]
option
-vv
:查看详细信息
远程仓库
添加远程仓库
git remote add <shortname_for_remote> <remote_url>
查看已添加的远程仓库
git remote [option]
:打印所有已添加的远程仓库名称
option: 使用-v
选项显示远程仓库的url
git remote show <remote_name>
:查看某个远程仓库的详细信息
拉取远程仓库的更新
git fetch <remote_name>
fetch
仅拉取远程仓库的更新,不会自动和本地分支合并,需要手动merge
git pull <remote_name>
:拉取远程仓库的更新并与自动本地分支合并
推送到远程仓库
git push <origin_repo> <local_branch[:remote_branch]>
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。
删除远程分支
git push origin --delete <branch_name>
远程仓库的重命名与移除
git remote rename <src> <dest>
git remote rm <remote_name>
变基
使用 rebase
命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样
据说rebase
可以让提交历史更简洁,目前没看出来
rebase
的原则:只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作