想研究Git很久了,一直没有找到很好的博客或论坛,近几天工作项目任务没有那么重,就想着找几篇文章把这玩意儿给解决掉,本博客是记录读廖雪峰老师所写的《Git教程》的随笔,以便巩固学习,若想学习到更详细的教程,请到廖老师的文章学习。
- 安装Git。这个自然不用多说了,笔者用的是Window系统,直接下载一个Git,然后下一步下一步安装就行了。
- 安装完成后,在cmd命令行中执行两个命令:第一个是git config --global user.name "你的用户名";第二个是git config --global user.email "你的邮箱";之所以执行这两个命令是因为Git是分布式的,需要每台机器标识出自己的机器名;参数global是指这台机器上所有的仓库都使用这个配置。注:若使用cmd执行这两个命令出错的话,可在应用程序(也就是开机-所有程序)中找到刚才安装的Git文件夹点击打开Git CMD,在这个命令行工具中执行刚才的两个命令。
- 创建版本库。所谓的版本库,其实也就是一个文件夹,例如我在C盘创建一个名叫GitRepository的文件夹,然后点着shift键右鼠标-选择在此处打开命令行,或者打开cmd然后cd到这个目录下,执行git init命令,把这个目录变成Git的管理仓库。新建一个文件在这个目录下,例如新建一个readMe.txt文档。然后执行git add readMe.txt命令让这个文件被git所管理,这个命令执行结束后没有任何提示是正确的;然后执行git commit -m "版本说明信息"。
- 理解几个概念问题:工作区即当前目录,当执行完init命令后,该目录下会多出一个.git文件夹叫版本库,此版本库里有两个比较重要的东西,一个叫暂存区(Stage),一个是git自动为我们创建的master分支以及指向master的一个指针叫HEAD;当多次执行add时,git的操作是把所add的内容放入暂存区,当执行commit时git会把内容放入分支中。
- git status查看本仓库中各文件信息的状态;git diff 文件名 比较一个文件变化的记录。
- git log显示从最近到最远的提交信息,如果不想一次性看那么多,可以加--pretty=oneline这个参数。
- 版本回退,git中HEAD表示当前的版本,HEAD^表示上一个版本,HEAD^^表示上上一个版本,如果想返回到第100个版本,可以使用HEAD~100。回退到上一个版本的命令git reset --hard HEAD^;指定回到某一版本可以用commit id进行回退,commit id就是在git log中看到的那一串字符串,不必写完,只需要写前几位就可以查到了,命令是:git reset --hard id号。如果从HEAD回退到commit id,这个时候在git log中便看不到了HEAD,若想再回到HEAD,可以用git reflog查看每一步的操作,找到commit id然后回退回去。
- git checkout -- file,回滚工作区的修改。如果该文件已commit,则回到暂存区时的状态,若该文件在暂存区,则回到工作区即没有进行修改之前的状态。此命令的--很重要,若没有的话表示切换分支。git reset HEAD file把暂存区的修改撤消掉,重新回到工作区。
- git rm删除版本库中的文件,然后执行git commit.
-
远程仓库GitHub。因为Git与GitHub之间的传输通过SSH协议,所以需要生成SSH密钥,生成方式在Git Bash里执行
ssh-keygen -t rsa -C "youremail@example.com"命令
命令会在指定的盘符下生成一对公私密钥,把pub密钥中的内容复制到GitHub的Account Setting里可以推送文件到GitHub了; 若有多台电脑需要上传文件到GitHub上,可以添加多个公钥到Account Setting上。
-
添加本地仓库内容到远程GitHub上
通过以下命令可以把本进仓库内容推送到远程仓库上git remote add origin git@github.com:GitHub账户名/远程仓库名.git origin为GitHub默认的远程仓库名,可修改,通过此便可把本地仓库与远程仓库关联起来
git push -u origin master
-
从远程库克隆仓库到本地
git clone git@github.com:GitHub账户名/需要克隆的库名.git
-
创建分支
$ git checkout -b dev其中的-b参数表示创建分支并把当前分支切换为新创建的分支,相当于git branch dev;git checkout dev;两个命令的集合;
- 查看分支:git branch会以列表的形式把所有分支都列出来,并在当前分支的前面加一个“*”号
- 合并分支:git merge 分支名;通过这种方式合并的形式是Fast_Forward模式
- 删除分支:git branch -d 分支名
- 查看分支合并图:git log --graph
-
分支策略:在合并分支的时候添加--no-ff来禁用Fast_forward模式,可以看到曾经有合并过分支的历史记录
git merge --no-ff -m "merge with no-ff" dev
-
Bug分支:当正在开发一个任务,还没有完成的时候,有一个Bug需要修改,此时要把当前进行的工作储存起来,可用git stash命令;然后从需要修复Bug的分支上如master分支上创建临时分支,先切换到master分支,然后创建临时分支,如git checkout -b issue-101;修复完成后切换到master分支上,然后把issue-101分支合并到master分支上;回到刚才的储存工作空间,用git stash list查看储存的列表;恢复刚才的存储用git stash apply但是此时stash并没有删除,若想删除可以用git stash drop;这两个命令可以用git stash pop来代替;也可多次stash,然后用git stash list来查看stash列表,然后用
git stash apply stash@{0}来恢复具体的某一个stash
-
Feature分支:每添加一个新功能,为了不搞乱master分支,可以新建一个Feature分支,当开发完成后合并到master分支,然后删除该featrure分支;但当没合并分支时,此功能又不需要了,此时用
git branch -D 分支名 删除该分支,注意D必须大写
- 查看远程库的信息用:git remote命令,若想查看更详尽信息可加上-v参数
- 推送分支就是把本地该分支上的信息推送到远程库上:git push origin master,若想推送到dev上则把master改为dev就行了
-
多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin <branch-name>
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果
git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。这就是多人协作的工作模式,一旦熟悉了,就非常简单。
-
- git rebase命令可以把提交的分叉记录整理成一条线
-
git给每个版本打标签:首先切换到需要打标签的分支上,然后使用git tag 标签名打标签,可以使用git tag查看所有的标签;查看所有的提交记录命令:
git log --pretty=oneline --abbrev-commit;对某一个提交ID打标签:git tag 标签名 CommitID;可以用git show 标签名来查看标签的详细信息;还可以添加两个参数 -a 标签名,-m 说明文字信息,如:git tag -a 标签名 -m "打了一个标签" CommitID
- 删除标签:git tag -d 标签;因为标签是打在本地的,所以可以直接删除,若想把标签推送到远程仓库,可以用git push origin 标签名或一次性推送全部标签到远程仓库:git push origin --tags;要删除远程标签比较麻烦,需要先删除本地标签,然后再删除远程的标签,命令是:git push origin :refs/tags/标签名
- 自定义git字体颜色:git config --global color.ui true
-
忽略特殊的不想提交的文件:在git仓库下创建一个.gitignore文件,然后把需要忽略的文件名添加进去,然后把这个.gitignore文件提交;这个时候如果想提交在这个名单中的文件到远程仓库中,可以用:git add -f 文件名 进行强制提交;
git check-ignore -v App.class 检查ignore文件中哪个规则出了问题