配置
可以在全局范围做配置,也可以在项目范围做配置。全局范围的配置,会在当前登录用户的所有 Git 项目里面生效。项目范围的配置,只会在当前 Git 项目里面生效。
配置文件所在位置:
- 全局范围:~/.gitconfig
- 项目范围:项目根目录/.git/config
查看编辑配置文件
git config -l [--global | --local]
git config -e [--global | --local]
配置用户信息
git config [--global] user.name "jack"
git config [--global] user.email "jack@githumb.com"
配置别名
git config [--global] alias.st status
git config [--global] alias.ci commit
git config [--global] alias.co checkout
git config [--global] alias.br branch
git config [--global] alias.lg log --oneline --decorate --all
忽略特殊文件
### 全局范围
vi ~/.gitignore
# 编辑配置文件
.DS_Store
# 指定全局配置文件
git config --global core.excludesfile ~/.gitignore
### 项目范围
cd 项目根目录
vi .gitignore
# 编辑配置文件
# 参考:https://github.com/github/gitignore
# 可以在项目的任意子目录中添加 .gitignore 文件,文件内的规则对 .gitignore 文件所在目录以及该目录的所有后代目录有效
基本操作
初始化
git init
ls -la
.git 目录下是版本库
添加文件
git add .
git commit -m '提交信息'
修改文件
git add .
git commit -m '提交信息'
删除文件
git rm file
git commit -m '提交信息'
重命名文件
git mv file newfile
git commit -m '提交信息'
移动文件
git mv file directory/file
git commit -m '提交信息'
提交操作
git commit -m '提交信息' # 将暂存区内容提交到本地仓库
git commit -am '提交信息' # 将工作区内容添加到暂存区,然后再将暂存区内容提交到本地仓库
git commit --amend -m '提交信息' # 使用一次新的 commit ,替代上一次 commit
查看操作
git status
git log
git log -10 --oneline --decorate --all --graph
git log | grep '关键字'
git reflog
git show commit-id
差异、撤销、回退操作
差异
# 比较工作区和暂存区
git diff [file]
# 比较暂存区和上次提交
git diff --cached [file]
# 比较工作区和上次提交
git diff HEAD [file]
# 比较工作区和某次提交
git diff commit-id | HEAD | master | v0.1 [file]
# 说明:HEAD branch tag 都是指针,指向某个 commit-id
# 统计一下有哪些文件被改动,有多少行被改动
git diff --stat
# 比较两次提交之间的差异
git diff old-commit..new-commit
git diff master../origin/master
git diff HEAD^..HEAD
版本回退
# 工作区 暂存区 版本库 都恢复到 commit-id
git reset --hard commit-id [file]
# 暂存区 版本库 恢复到 commit-id,工作区内容不变。如果不加参数,默认为 --mixed
git reset --mixed commit-id [file]
git reset commit-id [file]
# 版本库恢复到 commit-id,工作区 暂存区内容不变
git reset --soft commit-id [file]
撤销
# 用暂存区的内容替换工作区的内容
git checkout file
git checkout .
# 用上次提交的内容替换工作区和暂存区的内容
git reset --hard HEAD [file]
# 用上次提交的内容替换暂存区的内容,保留工作区的内容
git reset --mixed HEAD [file]
# 撤销某次提交的内容
git revert commit-id # 撤销某次提交的内容
git revert -m 保留的分支序列号[1或者2] 某次合并的commit-id # 撤销某次分支合并
stash
# 保存工作现场
git stash
# 恢复工作现场
git stash pop
git stash apply stash@{0}
git stash drop stash@{0}
# 查看工作现场
git stash list
分支
分支就是一个指针,指向 commit,HEAD 也是一个指针,指向分支,比如 HEAD->master->commit。
参考 分支
查看分支
git branch
git branch -r # 查看远程分支
git branch -a # 查看所有分支
新建分支
git branch dev # 新建分支,新分支指向 HEAD 所指向的 commit ,该 commit 不一定是最新的 commit
git checkout dev # 切换分支
git checkout -b dev # 新建并切换分支,新分支指向 HEAD
git branch dev commit-id | HEAD^ | origin/dev | v0.1 # 新建分支,新分支指向某个 commit-id
git checkout -b test commit-id | HEAD~10 | origin/dev | v0.1 # 新建分支,新分支指向某个 commit-id
删除分支
git branch -d dev # 删除分支
git branch -D dev # 强制删除分支,当 dev 分支没有进行过合并的时候,普通 -d 无法删除 dev 分支,必须强制 -D 删除
重命名分支
git branch -m dev develop # 把分支 dev 重命名为 develop
合并分支
git merge dev # 把 dev 分支合并到当前分支
git merge dev --no-ff -m '提交信息' # 把 dev 分支合并到当前分支,并且禁止使用快速合并
切换分支
git checkout master # 切换到 master 分支
git checkout - # 切换到上一次的分支
标签管理
标签就是一个指针,指向某个 commit。标签和 commit 的关系就像域名和 ip 地址的关系。
标签和分支没有关系,标签不属于某个分支,标签只是某个 commit-id 的别名。
创建标签
git tag v1.0 # 在 HEAD 指向的 commit-id 处打一个标签
git tag v1.0 commit-id
删除标签
git tag -d v1.0 # 删除本地标签
git push origin :refs/tags/v1.0 # 删除远程标签
推送标签
git push origin v1.0
git push origin --tags
远程
参考 [远程][2]
[2]: http://www.ruanyifeng.com/blog/2014/06/git_remote.html
clone
git clone 支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等。
该命令会在本地主机生成一个目录,与远程主机的版本库同名。如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。
克隆版本库的时候,所使用的远程主机自动被Git命名为origin,如果想用其他的主机名,需要用git clone命令的-o选项指定。
git clone <版本库的网址>
git clone <版本库的网址> <本地目录名>
git clone -o <远程主机名称> <版本库的网址>
remote
Git要求每个远程主机都必须指定一个主机名,git remote命令就用于管理主机名
git remote # 列出所有远程主机
git remove -v # 列出所有远程主机以及远程主机的网址
git remote add origin url # 添加远程主机 origin
git remote rm origin # 删除远程主机 origin
git remote rename origin hello # 重命名远程主机 origin 为 hello
git branch -a # 查看所有分支,包括远程分支
fetch
将某个远程主机的更新,取回本地,通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响
# 将某个远程主机所有分支的更新,全部取回本地
git fetch origin
# 将远程主机的 master 分支的更新,取回本地
git fetch origin master
git checkout master
# 将本地 master 分支与远程 origin/master 分支合并
git merge origin/master
# 或者
# 将本地 master 分支 rebase 到远程 origin/master 分支
git rebase origin/master
pull
取回远程主机某个分支的更新,再与本地的指定分支合并,相当于先 fetch 再 merge
# 取回 origin 主机的 next 分支,与本地的 master 分支合并
git pull origin next:master
# 取回 origin 主机的 next 分支,与本地的当前分支合并
git pull origin next
push
将本地某个分支的更新,推送到远程主机的指定分支。push 的执行结果必须是 "快速向前" (fast forward) 的,否则会报错。
# 把本地 master 分支的更新,推送到远程主机 origin 的 next 分支
git push origin master:next
# 把本地 master 分支的更新,推送到远程主机 origin 的 master 分支。如果后者不存在,则会被新建
git push origin master
rebase
参考:http://gitbook.liuhui998.com/4_2.html
http://www.ruanyifeng.com/blog/2015/08/git-use-process.html?utm_source=tuicool&utm_medium=referral
git fetch
git rebase origin/dev
git rebase -i origin/dev # -i 可以合并多次 commit
git rebase --abort # 将当前分支返回到 rebase 之前的状态
git rebase --continue # 如果有冲突,解决冲突之后,先 git add . 然后 git rebase --continue ,就可以继续合并分支
分支关联
本地某个分支如果和远程主机的指定分支相关联,则 push 和 pull 操作都可以省略很多参数
# 把本地当前分支的更新,推送到与本地当前分支相关联的远程分支
git push
# 取回与本地当前分支相关联的远程分支的更新,并且和本地当前分支合并
git pull
本地分支与远程分支可以手动建立关联,某些操作会自动关联
# 自动将远程仓库的 master 和本地仓库的 master 关联。不管远程有几个分支,本地克隆的版本库只有一个 master 分支,其他的远程分支不会同步到本地,因为远程的 master 分支是默认分支。
git clone url
# 将本地 master 分支的内容推送到远程主机 origin 的 tester 分支,同时为这两个分支建立关联
git push -u origin master:tester
# 将本地 master 分支与远程主机 origin 的 tester 分支建立关联
git branch --set-upstream-to origin/tester master
# 在 origin/dev 指向的 commit-id 上创建本地分支 test ,并且把本地分支 test 与远程分支 dev 建立关联
git branch test origin/dev
git checkout -b test origin/dev
# 如果只是把 origin/dev 指向的 commit-id 添加到 git branch test commit-id 或者 git checkout -b test commit-id,则新建的分支 test 不会与远程分支 dev 建立关联
删除远程分支
# 如果省略本地分支名,等同于推送一个空的本地分支到远程分支,相当于删除远程分支
git push origin :master
# 也可以通过 --delete 参数删除
git push origin --delete master
网友评论