优势
个人理解:
-
git 检出分支速度快,不需要完全复制一份代码,只需要指定引用指向。
-
git本地具有历史提交记录,开发方便,可能存在安全性问题。
-
git有本地仓库,即使远程仓库发生故障 ,依旧不影响本地代码提交。 除此之外,远程仓库可通过本地仓库进行恢复。
状态
-
未跟踪:此文件在文件夹中,但并没有加入到git库,不参与版本控制。 通过
git add
状态变为Staged
。 -
未修改: 即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种去处,如果它被修改,而变为
Modified
。如果使用git rm
移出版本库,则成为Untracked
文件。 -
已修改:仅仅是修改,并没有进行其他的操作。这个文件也有两个去处,通过
git add
可进入暂存staged
状态,使用git checkout
则丢弃修改过,返回到unmodify
状态,这个git checkout
即从库中取出文件,覆盖当前修改。 -
暂存:执行
git commit
则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify
状态。执行git reset HEAD filename
取消暂存,文件状态为Modified
。
Basic
-
添加文件到暂存区:
git add filename
。这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 -
将所有修改文件添加到暂存区:
git add --all
-
提交修改到本地仓库:
git commit -m 'commit message'
/git commit -a -m 'commit message'
-a 参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过
git add
添加到暂存区。注意,新加的文件(未被Git系统管理的文件)是不能被提交到本地仓库的。 -
从本地仓库中删除文件:
git rm filename
-
从本地仓库中删除文件,但本地文件保留 :
git rm --cached filename
-
重命名文件:
git mv filename newfilename
或者直接修改完毕文件名 ,进行git add -A && git commit -m 'commit message'
-
获取远程最新代码到本地:
git pull (origin branchname)
可以指定分支名,也可以忽略。git pull
=git fetch
+git merge
。git merge
支持以下三种合并方式:-
--ff
不会显示 feature,只保留单条分支记录。git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建commit 。 -
--no -ff
强行关闭fast-forward方式。可以保存你之前的分支历史。能够更好的查看 merge历史,以及branch 状态。 -
--squash
用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。
-
Repository
-
检出仓库代码:
git clone repository-url
/git clone repository-url local-derectoryname
git clone https://code.bestvike.com/oa/oa.git
检出仓库代码到本地。git clone https://code.bestvike.com/oa/oa.git test
检出仓库代码到本地,并重命名。
-
查看远程仓库:
git remote -v
-
添加远程仓库:
git remote add [name] [repository-url]
-
删除远程仓库:
git remote rm [name]
-
修改远程仓库地址:
git remote set-url origin new-repository-url
-
拉取远程仓库:
git pull [remoteName] [localBranchName]
-
推送远程仓库:
git push [remoteName] [localBranchName]
git push -u orgin master
将当前分支推送到远端master分支。提交本地 test分支作为远程仓库的 master 分支:git push origin test:master
;提交本地 test 分支作为远程的 test 分支 :git push origin test:test
。
Log
-
查看日志:
git log
-
查看日志,并查看每次的修改内容:
git log -p
-
查看日志,并查看每次文件的简单修改状态:
git log --stat
-
一行显示日志:
git log --pretty=oneline / git log --pretty='format:"%h - %an, %ar : %s'
-
查看日志范围:
-
查看最近十条日志:
git log -10
-
查看指定日期之前日志,比如:
git log --until=2020-04-12
-
查看指定日期到现在日志,比如:
git log --since=2020-04-12
-
只查看某个用户的提交:
git log --committer=user.name / git log --author=user.name
-
只查看提交信息中包含某个特殊信息的历史,比如包含’测试’:
git log --grep '测试'
-
Reset
git reset --hard HEAD^
重置位置的同时,直接将工作目录、 暂存区及仓库都重置成目标节点的內容。git reset --soft HEAD^
重置位置的同时,保留工作目录和暂存区的内容,只让仓库中内容重置成目标节点的內容。git reset --mixed HEAD^
(默认) 重置位置的同时,只保留工作目录的內容,将暂存区和仓库中的內容都重置成目标节点的內容。
Diff
- 查看工作区和暂存区之间差异:
git diff
- 查看工作区与当前仓库版本版本差异:
git diff HEAD
- 查看暂存区与当前仓库版本差异:
git diff --cached
/git diff --staged
- 不查看具体改动,只查看改动文件:
git diff --stat
Branch 命令
-
查看分支:
git branch
、git branch -v
、git branch -vv
、git branch --merged
、git branch --no-merged
-
创建分支:
git branch branchname
- 例: 基于 master 分支新建 dev 分支 :
git branch dev
- 例: 基于 master 分支新建 dev 分支 :
-
基于之前的某个 Commit 新开分支:
git branch branchname
-
例: 基于上线的的提交 a207a38d634cc10441636bc4359cd8a18c502dea 创建 hotfix 分支 :
git branch hotfix a207a38
-
例: 基于 remoteBranch、localBranch、commitId、tag 创建分支均可以
git checkout -b newbranch localBranch/remoteBranch/commitId/tag
-
例: 创建一个空的分支
git checkout --orphan gh-pages # 创建一个orphan的分支,这个分支是独立的 Switched to a new branch \'gh-pages\' git rm -rf . # 删除原来代码树下的所有文件 rm \'.gitignore\' #注意这个时候你用git branch命令是看不见当前分支的名字的,除非你进行了第一次commit。添加新的文件,并且 commit 掉,就能看到分支了。
-
-
切换分支:
git checkout branchname
- 例: 由分支 master 切换到 dev 分支:
git checkout dev
- 例: 由分支 master 切换到 dev 分支:
-
创建新分支并切换到下面:
git checkout -b branchname
或者git branch branchname && git checkout branchname
- 例:基于 master 分支新建 dev 分支,并切换到 dev 分支上:
git checkout -b dev
或git branch dev && git checkout dev
- 例:基于 master 分支新建 dev 分支,并切换到 dev 分支上:
-
查看分支代码不同:
git diff branchname
比较 branchname 分支与当前分支的差异点,若只看文件差异,不看差异内容:git diff branchName --stat
-
合并分支:
git merge branchname
将 branchname 分支代码合并到当前分支 -
删除分支:
git branch -d branchname
强制删除未合并过的分支:git branch -D branchname
-
重命名分支:
git branch -m dev development
将分支 dev 重命名为 development -
查看远程分支:
git branch -r
或git branch -r -v
-
获取远程分支到本地:
git checkout -b local-branchname origin/remote-branchname
-
推送本地分支到远程:
git push origin remote-branchname
或git push origin local-branchname:remote-branchname
- 将本地 dev 代码推送到远程 dev 分支:
git push (-u) origin dev
或git push origin dev:dev
- (技巧)将本地 dev 分支代码推送到远程 master 分支:
git push origin dev:master
- 将本地 dev 代码推送到远程 dev 分支:
-
删除远程分支:
git push origin :remote-branchname
或git push origin --delete remote-branchname
-
手动跟踪分支,master分支追踪origin/next分支:
git branch --track master origin/next
或者git branch --set-upstream-to=origin/master
看 git 的版本是否支持。
Tag
-
查看 tag:
git tag
-
查找指定 tag,比如查找 V1.0.* :
git tag -l 'V1.0.*'
会列出匹配到的,比如 V1.0.1,V1.0.1.1,V1.0.2 等 -
创建轻量级 tag(lightweight tags):
git tag tag-name
,例如:git tag v1.0
-
创建 tag(annotated tags):
git tag -a tag-name -m 'msg'
,例如:
git tag -a v1.0.0 -m '1.0.0版本上线完毕打tag'
-
查看指定 tag 信息:
git show tag-name
-
基于历史某次提交(commit)创建 tag :
git tag -a tagname <sha1-of-commit>
- 例:基于上线时的提交 a207a38d634cc10441636bc4359cd8a18c502dea 创建tag:
git tag -a v1.0.0 a207a38
- 例:基于上线时的提交 a207a38d634cc10441636bc4359cd8a18c502dea 创建tag:
-
删除 tag :
git tag -d tagname
-
拉取远程 tag 到本地:
git pull remotename --tags
例如:git pull origin --tags
-
推送 tag 到远程服务器:
git push remotename tagname
例如:git push origin v1.0.0
-
将本地所有 tag 推送到远程:
git push remotename --tags
例如:git push origin --tags
-
删除远程 tag :
git push origin :tagname
或者git push origin --delete tagname
或者git push origin :refs/tags/v0.9