1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# 用户设置
git config --global user.name
"Your Name"
git config --global user.email
"email@example.com"
# 初始化仓库
git init
# Initialized empty Git repository in /Users/learngit/.git/
# 把文件添加到仓库
git add filename
# 把文件提交到仓库
git commit -m
"comment message"
# 初始化一个Git仓库,使用git init命令。
# 添加文件到Git仓库,分两步:
# 第一步,使用命令git add ,注意,可反复屡次使用,添加多个文件;
# 第二步,使用命令git commit,完成。
# 运行git status命令看看结果
git status
# 看看具体修改了什么内容
git
diff
filename
# 要随时掌握工做区的状态,使用git status命令。
# 若是git status告诉你有文件被修改过,用git diff能够查看修改内容
|
git log git log --pretty=oneline
首先,Git必须知道当前版本是哪一个版本,在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,固然往上100个版本写100个^比较容易数不过来,因此写成HEAD~100
。html
git reset --hard HEAD^ git reset --hard 3628164
Git提供了一个命令git reflog用来查看历史git
git reflog
HEAD指向的版本就是当前版本,所以,Git容许咱们在版本的历史之间穿梭,使用命令github
git reset --hard commit_id
穿梭前,用git log能够查看提交历史,以便肯定要回退到哪一个版本。正则表达式
要重返将来,用git reflog查看命令历史,以便肯定要回到将来的哪一个版本。sql
工做区(Working Directory):就是你在电脑里能看到的目录,好比个人learngit文件夹就是一个工做区。shell
版本库(Repository):工做区有一个隐藏目录“.git”,这个不算工做区,而是Git的版本库。vim
Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。windows
前面讲了咱们把文件往Git版本库里添加的时候,是分两步执行的:bash
第一步是用“git add”把文件添加进去,实际上就是把文件修改添加到暂存区;服务器
第二步是用“git commit”提交更改,实际上就是把暂存区的全部内容提交到当前分支。
git checkout -- file能够丢弃工做区的修改
git checkout -- filename
git checkout -- file命令中的“--”很重要,没有“--”,就变成了“建立一个新分支”的命令.
用命令git reset HEAD file能够把暂存区的修改撤销掉(unstage),从新放回工做区
git reset HEAD filename
git reset命令既能够回退版本,也能够把暂存区的修改回退到工做区。当咱们用HEAD时,表示最新的版本。
场景1:当你改乱了工做区某个文件的内容,想直接丢弃工做区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工做区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操做。
确实要从版本库中删除该文件,那就用命令git rm删掉,而且commit
git rm test.txt git commit -m "remove test.txt"
另外一种状况是删错了,由于版本库里还有呢,因此能够很轻松地把误删的文件恢复到最新版本
git checkout -- test.txt
git checkout实际上是用版本库里的版本替换工做区的版本,不管工做区是修改仍是删除,均可以“一键还原”。
命令git rm用于删除一个文件。若是一个文件已经被提交到版本库,那么你永远不用担忧误删,可是要当心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
git remote add origin git@server-name:path/repo-name.git
git push -u origin master
第一次推送master分支的全部内容;git push origin master
推送最新修改;git remote add origin git@server-name:path/repo-name.git git push -u origin master
Git自己的源代码你既能够用 git:// 协议来访问,也能够经过http 协议来访问:
git clone git://git.kernel.org/pub/scm/git/git.git git clone http://www.kernel.org/pub/scm/git/git.git
1
2
3
4
5
6
|
git branch
# 查看分支
git branch name
# 建立分支
git checkout name
# 切换分支
git checkout -b name
# 建立+切换分支
git merge name
# 合并某分支到当前分支
git branch -d name
# 删除分支
|
在当前分支下,要把dev分支的内容合并
git merge dev
当Git没法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph
命令能够看到分支合并图。
在实际开发中,咱们应该按照几个基本原则进行分支管理:
首先,master分支应该是很是稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,好比1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每一个人都在dev分支上干活,每一个人都有本身的分支,时不时地往dev分支上合并就能够了。
Git还提供了一个stash功能,能够把当前工做现场“储藏”起来,等之后恢复现场后继续工做:
git stash
如今,用git status查看工做区,就是干净的(除非有没有被Git管理的文件),所以能够放心地建立分支来修复bug。
首先肯定要在哪一个分支上修复bug,假定须要在master分支上修复,就从master建立临时分支:
1
2
3
4
5
|
# 转换到master分支
git checkout master
# 建立并转换到的名字为 issue-101 的分支
git checkout -b issue-101
|
查看存储的工做用git stash list
git stash list
工做现场还在,Git把stash内容存在某个地方了,可是须要恢复一下,有两个办法:
一是用git stash apply
恢复,可是恢复后,stash内容并不删除,你须要用git stash drop
来删除;
另外一种方式是用git stash pop
,恢复的同时把stash内容也删了:
修复bug时,咱们会经过建立新的bug分支进行修复,而后合并,最后删除;
当手头工做没有完成时,先把工做现场git stash一下,而后去修复bug,修复后,再git stash pop,回到工做现场.
若是要丢弃一个没有被合并过的分支,能够经过git branch -D name
强行删除。
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,而且,远程仓库的默认名称是origin
。
要查看远程库的信息,用git remote或者用git remote -v显示更详细的信息:
git remote git remote -v
推送分支,就是把该分支上的全部本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上。
1
2
3
4
|
git push origin master
# 若是要推送其余分支,好比dev,就改为
git push origin dev
|
可是,并非必定要把本地分支往远程推送,那么,哪些分支须要推送,哪些不须要呢?
总之,就是在Git中,分支彻底能够在本地本身藏着玩,是否推送,视你的心情而定!
多人协做时,你们都会往master和dev分支上推送各自的修改。
如今,模拟一个你的小伙伴,能够在另外一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另外一个目录下克隆:
1
2
3
4
5
6
|
git clone git:
//git
.kernel.org
/pub/scm/git/git
.git
# 指定本地dev分支与远程origin/dev分支的连接
git branch --
set
-upstream dev origin
/dev
git pull
|
所以,多人协做的工做模式一般是这样:
git push origin branch-name
推送本身的修改;git pull
试图合并;git push origin branch-name
推送就能成功!若是git pull提示“no tracking information”,则说明本地分支和远程分支的连接关系没有建立,用命令git branch --set-upstream branch-name origin/branch-name
。
这就是多人协做的工做模式,一旦熟悉了,就很是简单。
查看远程库信息,使用git remote -v
;
本地新建的分支若是不推送到远程,对其余人就是不可见的;
从本地推送分支,使用git push origin branch-name
,若是推送失败,先用git pull抓取远程的新提交;
在本地建立和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;
创建本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
;
从远程抓取分支,使用git pull,若是有冲突,要先处理冲突。
命令git tag name就能够打一个新标签,能够用命令git tag查看全部标签
1
2
3
4
5
6
7
8
9
10
11
12
|
# 新建标签
git tag v1.0
# 给commit id 为25656e2的历史版本打标签
git tag v1.0 25656e2
# 查看标签
git tag
# 用git show tagname查看标签信息
git show v1.0
|
命令git tag name用于新建一个标签,默认为HEAD,也能够指定一个commit id;
-a tagname -m "blablabla..."能够指定标签信息;
-s tagname -m "blablabla..."能够用PGP签名标签;
命令git tag能够查看全部标签;
推送某个标签到远程,使用命令git push origin tagname
,或者,一次性推送所有还没有推送到远程的本地标签
git push origin v1.0 git push origin --tags
分两步,一、删除本地;二、删除远程。
1
2
3
4
5
|
# 删除本地
git tag -d v0.9
# 删除远程
git push origin :refs
/tags/v0
.9
|
命令git push origin tagname能够推送一个本地标签;
命令git push origin --tags能够推送所有未推送过的本地标签;
命令git tag -d tagname能够删除一个本地标签;
命令git push origin :refs/tags/tagname能够删除一个远程标签。
不须要从头写.gitignore文件,GitHub已经为咱们准备了各类配置文件,只须要组合一下就可使用了。全部配置文件能够直接在线浏览:https://github.com/github/gitignore
git config --global core.excludesfile ~/.gitignore_global
便可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
git config --global push.default simple
git config --global credential.helper store
git config --global core.excludesfile ~/.gitignore_global
cat
> ~/.gitignore_global <<EOF
# Compiled source
*.com
*.class
*.dll
*.exe
*.o
*.so
# Packages
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.
tar
*.zip
# Logs and databases
*.log
*.sql
*.sqlite
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db
# VIM tmp files #
.*~
# vim临时文件
.*.swp
.*un~
tmp.txt
# 忽略tmp.txt
*.log
# 忽略全部log文件
tmp/*
# 忽略tmp文件夹全部文件
log/**/*.log
# 忽略log目录下的包括子目录下的全部log文件
EOF
|
若是敲git st就表示git status
1
2
3
4
5
6
|
git config --global
alias
.st status
git config --global
alias
.co checkout
git config --global
alias
.ci commit
git config --global
alias
.br branch
git config --global
alias
.unstage
'reset HEAD'
|
来源:http://www.oschina.net/question/156344_148084
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
git init
# 初始化本地git仓库(建立新仓库)
git config --global user.name
"xxx"
# 配置用户名
git config --global user.email
"xxx@xxx.com"
# 配置邮件
git config --global color.ui
true
# git status等命令自动着色
git config --global color.status auto
git config --global color.
diff
auto
git config --global color.branch auto
git config --global color.interactive auto
git clone git+
ssh
:
//git
@192.168.53.168
/VT
.git
# clone远程仓库
git status
# 查看当前版本状态(是否修改)
git add xyz
# 添加xyz文件至index
git add .
# 增长当前子目录下全部更改过的文件至index
git commit -m
'xxx'
# 提交
git commit --amend -m
'xxx'
# 合并上一次提交(用于反复修改)
git commit -am
'xxx'
# 将add和commit合为一步
git
rm
xxx
# 删除index中的文件
git
rm
-r *
# 递归删除
git log
# 显示提交日志
git log -1
# 显示1行日志 -n为n行
git log -5
git log --stat
# 显示提交日志及相关变更文件
git log -p -m
git show dfb02e6e4f2f7b573337763e5c0013802e392818
# 显示某个提交的详细内容
git show dfb02
# 可只用commitid的前几位
git show HEAD
# 显示HEAD提交日志
git show HEAD^
# 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
git tag
# 显示已存在的tag
git tag -a v2.0 -m
'xxx'
# 增长v2.0的tag
git show v2.0
# 显示v2.0的日志及详细内容
git log v2.0
# 显示v2.0的日志
git
diff
# 显示全部未添加至index的变动
git
diff
--cached
# 显示全部已添加index但还未commit的变动
git
diff
HEAD^
# 比较与上一个版本的差别
git
diff
HEAD -- .
/lib
# 比较与HEAD版本lib目录的差别
git
diff
origin
/master
..master
# 比较远程分支master上有本地分支master上没有的
git
diff
origin
/master
..master --stat
# 只显示差别的文件,不显示具体内容
git remote add origin git+
ssh
:
//git
@192.168.53.168
/VT
.git
# 增长远程定义(用于push/pull/fetch)
git branch
# 显示本地分支
git branch --contains 50089
# 显示包含提交50089的分支
git branch -a
# 显示全部分支
git branch -r
# 显示全部原创分支
git branch --merged
# 显示全部已合并到当前分支的分支
git branch --no-merged
# 显示全部未合并到当前分支的分支
git branch -m master master_copy
# 本地分支更名
git checkout -b master_copy
# 从当前分支建立新分支master_copy并检出
git checkout -b master master_copy
# 上面的完整版
git checkout features
/performance
# 检出已存在的features/performance分支
git checkout --track hotfixes
/BJVEP933
# 检出远程分支hotfixes/BJVEP933并建立本地跟踪分支
git checkout v2.0
# 检出版本v2.0
git checkout -b devel origin
/develop
# 从远程分支develop建立新本地分支devel并检出
git checkout -- README
# 检出head版本的README文件(可用于修改错误回退)
git merge origin
/master
# 合并远程master分支至当前分支
git cherry-pick ff44785404a8e
# 合并提交ff44785404a8e的修改
git push origin master
# 将当前分支push到远程master分支
git push origin :hotfixes
/BJVEP933
# 删除远程仓库的hotfixes/BJVEP933分支
git push --tags
# 把全部tag推送到远程仓库
git fetch
# 获取全部远程分支(不更新本地分支,另需merge)
git fetch --prune
# 获取全部原创分支并清除服务器上已删掉的分支
git pull origin master
# 获取远程分支master并merge到当前分支
git
mv
README README2
# 重命名文件README为README2
git reset --hard HEAD
# 将当前版本重置为HEAD(一般用于merge失败回退)
git rebase
git branch -d hotfixes
/BJVEP933
# 删除分支hotfixes/BJVEP933(本分支修改已合并到其余分支)
git branch -D hotfixes
/BJVEP933
# 强制删除分支hotfixes/BJVEP933
git
ls
-files
# 列出git index包含的文件
git show-branch
# 图示当前分支历史
git show-branch --all
# 图示全部分支历史
git whatchanged
# 显示提交历史对应的文件修改
git revert dfb02e6e4f2f7b573337763e5c0013802e392818
# 撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818
git
ls
-tree HEAD
# 内部命令:显示某个git对象
git rev-parse v2.0
# 内部命令:显示某个ref对于的SHA1 HASH
git reflog
# 显示全部提交,包括孤立节点
git show HEAD@{5}
git show master@{yesterday}
# 显示master分支昨天的状态
git log --pretty=
format
:
'%h %s'
--graph
# 图示提交日志
git show HEAD~3
git show -s --pretty=raw 2be7fcb476
git stash
# 暂存当前修改,将全部至为HEAD状态
git stash list
# 查看全部暂存
git stash show -p stash@{0}
# 参考第一次暂存
git stash apply stash@{0}
# 应用第一次暂存
git
grep
"delete from"
# 文件中搜索文本“delete from”
git
grep
-e
'#define'
--and -e SORT_DIRENT
git gc
git
fsck
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
## commit log提交时使用utf-8编码,避免服务上乱码
#git config --system i18n.commitEncoding utf-8
## git log使用utf-8显示
#git config --system i18n.logoutputencoding utf-8
##在windows中,建议禁止git对文件权限的跟踪(chmod后,仍会更新,缘由不详)
#git config --system core.filemode false
##不对0x80以上的字行进行quote,解决git status/commit时中文文件名乱码
#git config --system core.quotepath false
git config --global i18n.commitEncoding utf-8
git config --global i18n.logoutputencoding utf-8
git config --global core.filemode
false
git config --global core.quotepath
false
git config --global push.default simple
git config --global core.editor vim
# Set save passwd and igore files
git config --global credential.helper store
# 设置一些git别名,以即可以使用更为简洁的子命令
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 core.excludesfile ~/.gitignore_global
cat
> ~/.gitignore_global <<EOF
# Compiled source
*.com
*.class
*.dll
*.exe
*.o
*.so
# Packages
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.
tar
*.zip
# Logs and databases
*.log
*.sql
*.sqlite
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db
# VIM tmp files
.*~
# vim临时文件
.*un~
.*.swp
tmp.txt
# 忽略tmp.txt
*.log
# 忽略全部log文件
tmp/*
# 忽略tmp文件夹全部文件
log/**/*.log
# 忽略log目录下的包括子目录下的全部log文件
EOF
|
from:http://xstarcd.github.io/wiki/shell/git_common_cmds.html