受开发者llky之邀,希望看看Git基础培训内容,拷贝的一个ppt文档,大伙格式问题就忽略吧;
----------------------------华丽分割线-----------------------------
1.安装Git
l1. $ sudo apt-get install git l安装完成后,还需要最后一步设置,在命令行输入:
l2. $ git config --global user.name 'Your Name“
l3. $ git config --global user.email 'email@example.com'
2.创建版本库
1.创建一个空目录learngit
$ mkdir learngit
l$ cd learngit
2. 通过git init命令把这个目录变成Git可以管理的仓库
$ git init
2.1 把文件添加到版本库
l第一步,用命令git add告诉Git,把文件添加到仓库: l$ git add readme.txt
l第二步,用命令git commit告诉Git,把文件提交到仓库: l$ git commit -m 'wrote a readme file“ l
lgit commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
l可以多次add不同的文件, commit可以一次提交很多文件
2.2 工作区和暂存区
l1.工作区(Working Directory):就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区: l
2.版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。 lGit的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
l把文件往Git版本库里添加的时候,是分两步执行的:
l第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
l第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
l我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
l随时用git status查看一下状态: l$ git status
2.3 小结
l初始化一个Git仓库,使用git init命令。
l添加文件到Git仓库,分两步:
l· 第一步,使用命令git add file_name,注意,可反复多次使用,添加多个文件;
l· 第二步,使用命令git commit –m “xxx”,完成。
3.时光机穿梭
l$ git diff file_name l查看对文件作了什么修改.
ll用git diff HEAD -- file_name命令可以查看工作区和版本库里面最新版本的区别:
l$ git diff HEAD -- file_name
l l要随时掌握工作区的状态,使用git status命令。
l如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
3.1 版本回退
l把当前版本回退到上一个版本,就可以使用git reset命令:
l$ git reset --hard HEAD^ l把当前版本回退到上上一个版本就是HEAD^^,往上100个版本写成HEAD~100,也可以指定会退到某个版本.
l$ git reset --hard commit_id l查看提交的历史记录
l$ git log l如果嫌输出信息太多,可以加上 --pretty=oneline参数
l$ git log --pretty=oneline
如果想恢复到新版本, Git提供了一个命令git reflog用来记录你的一次命令:
$ git reflog
小结:
lHEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。 l穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。 l要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
3.2撤销修改
l$ git checkout -- readme.txt l意思就是,把readme.txt文件在工作区的修改全部撤销.
l$ git reset HEAD readme.txt l意思就是, 把暂存区的修改撤销掉(unstage),重新放回工作区.
3.3删除文件
l一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了. 这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了.
l现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
l$ git rm test.txt
l$ git commit -m 'remove test.txt“
l另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:l$ git checkout -- test.txt
4.远程仓库
l由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置: l第1步:创建SSH Key .在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开Shell ,创建SSH Key:
l$ ssh-keygen -t rsa -C youremail@example.com
l如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
l第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
l然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容: l点“Add Key”,你就应该看到已经添加的Key:
4.1 添加远程库
l1.首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库
l2.在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库.
l3.关联远程库,在本地的learngit仓库下运行命令:
l$ git remote add origin git@github.com:michaelliao/learngit.git
l4. 把本地库的所有内容推送到远程库上: l第一次推送 : $ git push -u origin master l之后推送: $ git push origin master
4.2 从远程库克隆
l首先,登陆GitHub,创建一个新的仓库,名字叫gitskills:
l我们勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件:
l现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:
l$ git clone git@github.com:michaelliao/gitskills.git
l然后进入gitskills目录看看,已经有README.md文件了
5 .分支管理
l 5.1 创建与合并分支
l l查看分支:git branch l创建分支:git branch <name>
l切换分支:git checkout <name>
l创建+切换分支:git checkout -b <name>
l合并某分支到当前分支:git merge <name>
l删除分支:git branch -d <name>
5.2 解决冲突
l用带参数的git log也可以看到分支的合并情况:
l$ git log --graph --pretty=oneline --abbrev-commit
l l当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
l用git log --graph命令可以看到分支合并图。
5.3 分支管理策略
l通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
l如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
l准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:
l$ git merge --no-ff -m 'merge with no-ff' dev
5.3.1 分支策略
l在实际开发中,我们应该按照几个基本原则进行分支管理:
l首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
l那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
l你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
l合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
5.4 Bug分支
lGit还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
l$ git stash l查看保存的内容:$ git stash list
l恢复工作现场:
l一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除:
l另一种方式是用git stash pop,恢复的同时把stash内容也删了:
l$ git stash pop
5.5 Feature分支
l开发一个新feature,最好新建一个分支;
l如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
5.6 多人协作
l要查看远程库的信息,用git remote -v显示更详细的信息:
l$ git remote –v l上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。 l
5.6.1 推送分支
l推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
l$ git push origin master l如果要推送其他分支,比如dev,就改成:
l$ git push origin dev
5.6.2 抓取分支
l多人协作的工作模式通常是这样:
l1. 首先,可以试图用git push origin branch-name推送自己的修改;
l2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
l3. 如果合并有冲突,则解决冲突,并在本地提交;
l4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
l如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
5.6.3 小结
l查看远程库信息,使用git remote -v;
l从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
l在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
l建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name; l从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。 l
6 . 标签管理
l6.1 创建标签 l
l命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
lgit tag -a <tagname> -m 'blablabla...'可以指定标签信息;
git tag -s <tagname> -m 'blablabla...'可以用PGP签名标签;
l命令git tag可以查看所有标签。 l命令git show <tagname>查看标签信息:
6.2 操作标签
l命令git push origin <tagname>可以推送一个本地标签;
l命令git push origin --tags可以推送全部未推送过的本地标签;
l命令git tag -d <tagname>可以删除一个本地标签; 命令git push origin :refs/tags/<tagname>可以删除一个远程标签
7 配置别名
l我们只需要敲一行命令,告诉Git,以后st就表示status:
l$ git config --global alias.st status l
l$ git config --global alias.co checkout
l$ git config --global alias.ci commit
l$ git config --global alias.br branch
l配置一个git last,让其显示最后一次提交信息:
l$ git config --global alias.last 'log -1' 这样,用git last就能显示最近一次的提交:
l$ git last
7.1 配置文件
l配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。 l每个仓库的Git配置文件都放在.git/config文件中:
l[core]
l repositoryformatversion = 0
l filemode = true
l bare = false
l logallrefupdates = true
l[alias]
l st = status
l last = log -1





































苏公安网备 32011402010933号