Table of Contents
版本控制软件
- BitKeeper
- CVS
- SVN
- Git
- Mercurial
Git
BitKeeper不赞助Linux团队后,Linus就着手开发了Git。
Git学习资料
- 官网: http://git-scm.com/
- 可以通过
man git
查看git文档以获取关于git的详细介绍。使用git --html-path
可以查看本地的git文档路径。
Git思想
Git缺点
仓库比较大时(1GB)有性能问题;- 存储二进制文件的每个版本,而不是采取计算变化量这种策略。
获取Git帮助
git help
git help command
或者man git-command
获取关于某个命令 command 的帮助git help -a/g
获取较全面的帮助
创建仓库(repository)
git init
配置Git
git config
用法:git config [<选项>]
- 选择读配置还是写配置
带有--get
之类字样的显然就是读取配置。从Manual中可以看到还有增加、移除配置等选项。 - 通过文件配置还是命令行选项配置
可以在命令行中逐个配置键值对,或者git config [<file-option>] -e | --edit
直接编辑配置文件,或者随便用个编辑器编辑相应的配置文件即可。 - 配置的形式
- 例子:
git config [--global] user.name "Your name"
git config [--global] user.emal you@email.com
git config [--global] color.ui true
- 配置范围
通过file-option选项指定配置范围。
file-option | 含义 |
–system | 从$(prefix)/etc/gitconfig中读写配置选项 |
–global | 从~/.gitconfig中读写配置选项 |
–local(默认值) | 从.git/config中读写配置选项 |
–file | 从filename中读写配置选项 |
在进行git config
操作时,如果是读操作,那么git依次从系统配置(system)、全局配置(global)和仓库配置(local)中读取配置,如果指定了file-option,那么git只从指定的位置读取配置。如果是写操作,那么git默认写到仓库配置里,如果指定了file-option,那么git就将配置写到file-option所代表的位置。
Git基本概念
- 工作区(working directory)
- 索引(INDEX)
- commit
A snapshot of your project. - HEAD
当前分支(branch)的最后一次提交。
3.基本操作
- 选择要要让git跟踪(track)的文件
git add your-file
git add .
git add --all
git add paths
可以使用文件名的通配符表达式,如果路径被加上了双引号表示在整个项目文件中进行匹配,否则只在当前目录下进行匹配。git add *.txt
当前目录;git add "*.txt"
整个项目文件夹中匹配。 - 查看修改
git status
查看自上一次提交(commit)以来,在工作目录所作的修改。git diff
查看自上次提交以来,未暂存(unstaged)的修改git diff --staged
查看已暂存的修改 - 取消暂存
git reset HEAD paths
git reset HEAD
- 放弃修改
git checkout -- paths
- 提交改变(commit)
git commit
git commit -m "This is a commit"
git commit -a
提交在已跟踪文件上作的全部改动git commit -am
- 取消提交(undoing a commit)
git reset --soft HEAD
将上次提交的改动移到暂存区里(reset into staging)git reset --soft commit
将HEAD移到commit,commit之后的提交都取消并将这些提交所做的改动都放到暂存区(staged)里去。git reset --hard commit
将HEAD移到commit,放弃该commit之后所做的所有改变。 - 补充提交(adding to a commit)
git commit --amend -m "adding something to this commit"
- 查看日志(log)
git log
查看过去所有的提交 - 远程仓库
git remote add origin(our name for this remote) repo-addr
增加一个远程仓库git remote -v
显示所有远程仓库git push -u origin master
推送本地提交到origin的master分支上。git pull
获取远程仓库上的commit changes。
在 push 之后,不要再进行取消提交,补充提交,放弃提交等操作。
已经push到远程仓库的commit是不会被改变的,虽然这些操作可以修改本地的提交历史,但是却不会改变远程仓库对应分支的提交历史。git clone repo-addr
克隆一个远程仓库 - 分支
git branch branch-name
创建一个新的分支,但是创建该分支后并不会切换到该分支。git checkout -b branch-name
创建一个新的分支,并且切换到该分支。git branch -r
列出所有远程分支git branch
列出本地分支git remote show origin
显示本地和远程仓库的分支信息。git push origin :branch_to_delete
删除远程分支git branch -d branch_to_delete
删除本地分支git branch -D branch_to_delete
强制删除本地分支git remote prune origin
删除远程仓库origin已经删除但是在本地还存在的分支 - TAG
A tag is a reference to a commit(used mostly for release versioning)git tag
列出已有taggit tag -a v0.0.1
添加一个taggit push --tags
推送新加的tag - REBASE
一般情况下,我们通过merge引入来源于其他分支的改动,但是merge操作会在当前分支创建merge commit节点(而且貌似会让日志变得比较乱?)。通过rebase操作,我们可以避免merge操作。
- 和远程分支相关的rebase:
假设本地分支master的workflow为A–>B–>C,远程分支master的workflow为A–>D–>E,现在我们要避免merge操作而且引入远程分支的改动,那么:- 首先
git fetch
,将origin/master的改动引入到本地的origin/master分支; - 然后执行
git rebase
,此操作会将本地提交移到一个临时区域里,然后引入远程分支的提交,然后再逐个引入临时区域里的提交。引入临时区域里的提交时可能会产生冲突(比如origin/master里的提交和本地分支上的提交修改了同一个文件),此时需要像解决merge conflict一样解决冲突(编辑有冲突的文件),然后执行git add
和git rebase --continue
命令继续rebase过程。
- 首先
- 和本地分支相关的rebase:
假设本地分支master的workflow为A–>B–>C,本地分支feature的workflow为A–>D–>E,现在我们要避免merge操作而且引入master上的提交,那么可以直接checkout到feature分支上,然后git rebase master
即可。但是此后master分支再要引入feature分支的提交就只有用merge操作了。
- DIFF
git diff
比较working directory与暂存区git diff commit
比较工作区与commitgit diff \<commit\>..\<commit\>
比较两个commit - 列出remote分支
git branch -r
- 分支重命名
git branch -m <new-branch-name>
git branch -m <old-branch-name> <new-branch-name>
- 推指定commit
git push <remote-name> <commit SHA>:<remote-branch-name>
- 修改上游分支
git branch -u <remote-name>/<remote-branch-name>
git branch ---set-upstream-to=<remote-name>/<remote-branch-name>
- 删除远程分支
git push origin :<branch-to-delete>
- 创建一个新的没有提交历史的分支
git checkout --orphan <branch-name>
- 迁移仓库
git clone --mirror <old-repo-url>
cd <cloned-repo>
git push --mirror <new-repo-url>
注意’–mirror’选项clone下来的仓库里不能执行常用的’git status’这种命令,会报错“Not a git repository”,因为这样clone下来的仓库是普通的git仓库里的’.git’这种东西。’git push –mirror’这个命令也不能乱用,误用会用错误的东西覆盖服务器上的远程仓库。Reference。
- 查看日志
git log
git config --global color.ui true
为log设置彩色显示git log --pretty=oneline
一次提交用一行显示git log --pretty=format:"%h %ad %s [%an]"
以指定格式输出日志git log --oneline -p
显示每次提交的具体变更git log --oneline --stat
git log --oneline --graph
显示一个可视化的workflowgit log --until=1.minute.ago
显示1分钟以前的提交git log --since=1.day.ago
显示1天之前开始的提交git log --since=1.month.ago --until=2.weeks.ago
git log --since=2000-01-01 --until=2012-12-21
placeholder | 含义 |
%ad | author date |
%an | author name |
%h | SHA hash |
%s | subject |
%d | ref names |
- 应用patch
git apply –whitespace=fix mychanges.patch
- cherry pick 多个提交
git cherry-pick A^..B
- 修改指定提交
使用git rebase -i
来回退到指定commit,rebase选项里该commit使用edit
选项而不是pick
选项,在对该commit进行修改后用git commit --amend
提交,然后继续git rebase --continue
就可以了。 - 删除分支
git branch -D xxx
- 删除远程分支
git push origin --delete <remote-branch>
- 只clone部分文件
通过sparseCheckout实现
- 远程force update之后的处理
如果报错:error: cannot update the ref ‘refs/remotes/origin/majiebo/fixBug’: unable to create directory for ‘.git/logs/refs/remotes/origin/majiebo/fixBug’: No such file or directory,那么可以尝试git update-ref -d refs/remotes/origin/majiebo
,参考链接:https://stackoverflow.com/a/64561177/5357784
- 文件权限处理
https://stackoverflow.com/a/44836635/5357784git update-index --chmod=+x <file>
- 获取短的commit id
git rev-parse HEAD
git rev-parse --short HEAD
git log --oneline
git log --pretty=oneline --abbrev-commit
- 重命名分支
git branch -m <old_branch> <new_branch>
- tag
删除一个tag
git tag -d <tag_name>
删除一个remote tag
git push --delete origin <tag_name>
list tag
git tag -l
近期评论