创建版本库
1.创建目录mkdir learngit
,进入cd learngit
2.将目录变成Git可以管理的仓库git init
,此时Git仓库就建好了,可以通过ls -ah
来查看常用的git命令及解释
1.git init
初始化Git管理仓库
2.git add file
文件添加到仓库
3.git commit -m "添加的注释"
提交
4.git status
查看add之后未commit的文件
5.git diff
查看上一步的区别
6.git log --pretty=oneline
查看版本历史,后面参数可以单行查看,显示更加清晰
7.git reset --hard commit_id
版本回退
8.git checkout -- readme.txt
把readme.txt文件在工作区的修改全部撤销,就是让这个文件回到最近一次git commit
或git add
时的状态。例如:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。或者当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,先git reset HEAD file
,就回到了场景1,第二步按场景1操作。
9.git rm test.txt
并且git commit
删除。
10.git remote add origin git@github.com:michaelliao/learngit.git
添加远程仓库。
11.git push -u origin master
把本地库的内容推送到远程,
由于远程库是空的,我们第一次推送master分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后远程与本地的库应该是一样的。
12.git push origin master
本地提交之后就可以远程推送。
13.git clone git@github.com:michaelliao/gitskills.git
从远程库克隆,首先远程库创建仓库gitskills
。
14.git checkout -b dev
创建并切换分支相当于git branch dev
与git checkout dev
。
15.git branch
查看分支情况,当前分支有星号。
16.git merge
合并指定分支到当前分支,当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。git status
可以查看冲突情况
17.git branch -d dev
删除分支。
18.git checkout name
切换分支。
19.git log --graph --pretty=oneline --abbrev-commit
查看分支情况。
20.git merge --no-ff -m "merge with no-ff" dev
不使用Fast forward合并模式,因为本次合并要创建一个新的commit,所以加上-m
参数,把commit描述写进去
21.git stash
将当前的工作现场储存起来等以后恢复现场继续工作。
场景:当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交,并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
a、git stash
暂存。
b、git status
确认工作区是干净的。
c、决定在master分支上解决git branch master
d、git checkout -b issu-101
创建临时分支
e、修复bug,然后提交文件git add file..
f、修复完成后,切换到master分支,合并,删除issu-101分支
g、回到dev分支继续干活git checkout dev
h、git stash list
查看暂存
i、git stash apply
恢复,但是恢复后,stash内容并不删除
j、git stash drop
删除
k、git stash pop
恢复并删除stash
22.git checkout -b feature-vulcan
软件开发中,总有无穷无尽的新的功能要不断添加进来。
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
23.git branch -D <name>
强行删除
24.git remote -v
查看远程仓库
25.git push origin branch-name
从本地推送分支
26.git pull
远程抓取分支
27.git checkout -b branch-name origin/branch-name
在本地创建和远程分支对应的分支
28.git branch --set-upstream branch-name origin/branch-name
建立本地分支和远程分支的关联
29.git tag v1.1
给当前分支的最新提交的commit上打一个标签
30.git tag
查看所有标签
31.git tag v0.9 6224937
给某个commit_id打上标签
32.git show tagname
查看标签信息
33.git tag -a v0.1 -m "version 0.1 released" 3628164
创建带有说明的标签,用-a
指定标签名,-m
指定说明文字
34.git tag -s <tagname> -m "blablabla..."
可以用PGP签名标签;
35.git tag -d v0.1
删除标签
36.git push origin v1.0
推送某个标签到远程
37.git push origin --tags
一次性推送全部尚未推送到远程的本地标签
38.git tag -d v0.9
先从本地删除
39.git push origin :refs/tags/v0.9
从远程删除
40.git config --global color.ui true
文件名就会标上颜色
41.git check-ignore
查找哪个规则写错了,忽略文件时需要添加.gitignore
文件,所有配置文件可以直接在线浏览:<a href="https://github.com/github/gitignore">传送门</a>
42.git config --global alias.st status
配置别名,告诉Git,以后st就表示status
43.git config --global alias.unstage 'reset HEAD'
此时git unstage test.py
相当于git reset HEAD test.py
44.git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git log估计会很爽...-
多人协作
a、可以试图用git push origin branch-name
推送自己的修改;
b、如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
试图合并;
c、如果合并有冲突,则解决冲突,并在本地提交;
d、没有冲突或者解决掉冲突后,再用git push origin branch-name
推送就能成功!如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream branch-name origin/branch-name
。这就是多人协作的工作模式,一旦熟悉了,就非常简单。 标签
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,
就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的
版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是
版本库的一个快照。tag就是一个让人容易记住的有意义的名字,它跟
某个commit绑在一起注意
1.git log
与git reflog
的区别:
前者回退版本之后,此版本之后的记录就自动抹除了,而后者不会,可以查到所有的记录。
2.git diff
与git diff --cache
的区别:
前者是是工作区(work dict)和暂存区(stage)的比较,而后者是暂存区(stage)和分支(master)的比较。
3.合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
4.忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通 过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比 如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
5.配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
a、每个仓库的Git配置文件都放在.git/config文件中
b、当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig
-
概念
工作区:就是建立的文件夹仓库learngit
版本库:工作区的隐藏的.git文件夹
暂存区:版本库里的最重要的部分,git add
添加的位置
分支:git自动为我们创建的为master,还有一个指向master的指针HEAD,git commit
提交的位置
如下图:
分布式VS集中式:</br>
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。