Git作为一种流行的版本管理系统已经广泛应用于我们的日常开发中,它的命令很多,为了减少后续查询的时间,在这里记录下一些常见的命令。下图展示了 git 的几个分区以及基本操作。
创建代码仓库
1)在当前文件夹创建仓库
$ git init
2)新建文件夹并创建仓库
$ git init [project-name]
3)克隆远程分支,默认为master分支
$ git clone [url] -b [branch-name] [your-folder]
// 克隆远程dev分支到MyProject
例: $ git clone https://github.com/fengyueran/Test.git -b dev MyProject
复制代码
配置
通过 git config 可以配置 git 的环境变量,这些变量存在三个不同的地方
- /etc/gitconfig 文件:适用于所有用户。
- ~/.gitconfig 文件:适用于当前用户。
- .git/config 文件: 当前项目中的配置文件,适用于当前项目。
每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆/etc/gitconfig 中的同名变量。
1)查看配置信息(包括用户名、邮箱等)
$ git config --list
2)编辑配置文件(--system/global)
$ git config -e
// 编辑当前用户的配置文件, --global:适用于当前用户, --system:适用于所有用户,不带参数: 当前项目
例: $ git config -e --global
3)设置当前用户信息
$ git config --global user.name [name]
$ git config --global user.email [email address]
4)清除当前用户信息
$ git config --unset --global user.name [name]
$ git config --unset --global user.email [email address]
复制代码
文件操作
1)添加文件file1,file2...到暂存区
$ git add [file1] [file2]
2)添加当前目录所有文件到暂存区
$ git add .
3) 添加目录(包括子目录)到暂存区
$ git add [dir]
4) 删除当前目录没有track过的文件
$ git clean -f
5) 删除当前目录没有track过的文件和文件夹
$ git clean -df
6) 删除所有本地未提交的修改
$ git checkout .
7)提交暂存区文件到仓库区
$ git commit -m [message]
8)追加到上一次提交
$ git commit --amend -m [message]
//修改上次提交
例: $ git commit --amend
9)撤销某次提交
$ git revert [commit]
例: $ git revert fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff
复制代码
查看信息
1)查看当前分支及其所有父类的提交历史
$ git log
2)可以查看所有分支的所有操作记录(包括已经被删除的commit记录和reset操作)
$ git reflog
3)查看变更的文件
$ git status
4)查看b提交相对a提交的差异
$ git diff [a-commit] [b-commit]
5)查看工作区与暂存区的差异
$ git diff
6)查看工作区与最新commit的前一次commit的差异,当从远程拉取更新时即可查看变动的内容。
$ git diff HEAD^
复制代码
远程操作
1)列出远程仓库名
$ git remote
2)列出远程仓库名及对应的地址
$ git remote –v
-> origin git@github.com:fengyueran/iOSNote.git (fetch)
-> origin git@github.com:fengyueran/iOSNote.git (push)
3)推送当前本地分支到远程分支
$ git push [remote-repository-name] [branch-name]
// 将当前分支dev推送到远程仓库origin的remoteDev分支
例: $ git push origin dev:remoteDev
-> * [new branch] dev -> remoteDev
// 省略远程仓库分支名则在远程创建当前同名分支dev
例: $ git push origin dev
-> * [new branch] dev -> dev
4)删除远程仓库origin的分支dev
例: $ git push origin --delete dev
5)添加远程仓库
$ git remote add [repository-name] [url]
// 在远程添加名为pb的仓库
例: $ git remote add pb git://github.com/fengyueran/test.git
6)重设远程仓库
$ git remote set-url [repository-name] [url]
// 重设远程仓库origin的地址
例: $ git remote set-url origin git://github.com/fengyueran/test.git
7)取消与远程仓库的关联
$ git remote remove [repository-name]
// 删除本地仓库与远程仓库template的关联
例: $ git remote remove template
8) 拉取远端数据
// 使你与另一仓库同步,提取你本地所没有的数据,不merge,拉取下来的数据在.git/FETCH_HEAD下
$ git fetch
// 将你的仓库与远端仓库origin同步,提取所有它独有的数据到本地分支以合并或者怎样。
$ git fetch origin
// 下面的fetch操作使用远程dev分支在本地创建localDev分支(但不会切换到该分支),如果本地不存在localDev分支,则会自动创建一个新的localDev分支,
如果本地存在localDev分支, 并且是fast forward, 则自动合并两个分支, 否则, 会阻止以上操作。
$ git fetch origin dev:localDev
-> * [new branch] dev -> localDev
9)从远程仓库提取数据并尝试合并到当前分支
// 基本上,该命令就是在git fetch之后紧接着git merge远端分支到当前分支
$ git pull
//当新建分支时,如果直接pull或push需要参数远程仓库名和分支名
$ git pull origin dev
如果想省略仓库名和分支名则需要建立追踪关系,执行如下命令
$ git pull --set-upstream origin dev
//merge操作会生成一个新的节点,之前的提交分开显示。而rebase操作不会生成新的节点, 因而能产生一个更为整洁的提交历史
$ git pull --rebase
//假设提交线图在执行pull前是这样的:
C1---D1---E1 remotes/origin/master
/
A---B---C2---D2 master
执行git pull则提交线图会变成这样:
C1---D1---E1 remotes/origin/master
/ \
A---B---C2---D2-F master
即会产生一个多余的合并历史,
如果执行git pull --rebase则提交线图会变成这样:
remotes/origin/master
|
A---B---C1---D1---C2'---D2' master
可以看到,应用rebase则不会有新的提交F。C2,D2删除后重新提交为C2',D2'了。
复制代码
分支操作
1)查看本地分支
$ git branch
2)查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话)
$ git branch -r
3)新建分支
$ git branch [branch-name]
例: $ git branch dev
4)切换分支
$ git checkout [branch-name]
例: $ git checkout dev
5)新建并切换分支
$ git checkout -b [branch-name]
// 当前分支的记录都会到新分支dev上
例: $ git checkout -b dev
6)删除分支
$ git branch -D [branch-name]
7)叫起合并冲突工具kdiff3
$ git mergetool -t kdiff3
8) 合并某个分支到当前分支
// 如果不是`fast forward'则会产生合并的提交历史
$ git merge [branch-name]
// 将hotfix分支合并到当前分支
例: $ git merge hotfix
// 无论是否是`fast forward'都产生合并的提交历史
例: $ git merge hotfix --no-f
9) 选择任意一个commit,合并进当前分支
$ git cherry-pick [commit]
10)合并提交历史
// 当我们由master分支切换到新的分支dev工作,工作结束后想merge回master,如果直接在master应用git merge dev,
dev的提交历史就会出现在master中,有时这些记录很琐碎没有必要添加到master上,用squash就能解决这一问题。分两步进行:
第一步:squash后dev上的提交就变成了新的文件
$ git merge --squash dev
第二步:重新commit代替之前所有提交
$ git commit -m "dev"
复制代码
版本回退
1)储存临时文件
//当工作区有未提交的文件,又想切换到另一个branch时就可以用git stash暂时存储
$ git stash
2)查看存储了哪些文件
$ git stash list
3)应用存储的临时文件
// 当回到之前的dirty工作区时可以通过git stash apply来恢复之前未提交的文件,也可以在其他branch应用这些存储的临时文件
$ git stash apply
4) 让单个文件回退到指定的版本
a:进入到文件所在文件目录,或者能找到文件的路径
$ git reflog test.js
-> 60e207a (HEAD -> master) HEAD@{0}: commit: test.js +2
1435819 HEAD@{1}: commit: test.js +1
b:回退到指定的版本
$ git reset 1435819 test.js
复制代码
tag
1) 轻量级tag
$ git tag [version]
例: $ git tag v1.0.0
2) 创建一个含附注类型的标签非常简单
$ git tag -a [version] -m "[detail]"
$ git tag -a v1.1.1 -m "CuraCloudMI version 1.1.1"
3) 查看tag
$ git show [version]
4) 删除tag
git tag -d [version]
复制代码
其他
1) 查看某个命令的帮助
git help [command-name]
2) 保留空文件
在空文件夹中新建.gitkeep文件
3) 忽略某些文件
在.gitignore文件中添加需要忽略的文件夹或文件
例:
//忽略Pods文件夹下的所有文件
platforms/ios/Pods
//忽略www下的所有文件除了plugins
platforms/ios/www/*
!platforms/ios/www/plugins
复制代码