本篇博客内的内容,主要摘抄自 廖雪峰的 Git教程,这篇教程写的通俗易懂,步步深入,是我见过最棒的Git教程了。下面的全部内容,摘抄自此教程,有需要的朋友,请看完整版。

Git版本库

git在创建版本库时,会自动生成一个.git隐藏目录,里面最重要的是称为stage的暂存区,Git创建的当前主分支名为 master,指向master的指针HEAD。

可以这样简单来理解,git add 把需要提交的文件修改通通放在暂存区,然后,git commit一次性提交暂存区的所有修改。Git这样设计的目的,为了跟踪并且管理文件的修改,关注点是文件的差异。每次对原始文件的修改,如果不add到暂存区中,那么commit操作就不会对其生效。

Git回退

Git必须知道当前版本是哪个版本,在Git中,使用HEAD表示当前版本,上一个版本为HEAD^,上上一个版本为HEAD^^。

举例:我们要把当前版本回退到上一个版本中去,可以使用git reset 命令

git reset –hard HEAD^

这个回退,会使得git log中,最新版本提交的日志消失。如果我们记得最新版本提交的commit id(前6位就足够了),可以使用

git reset –hard COMMIT_ID 来返回到最新版本,如果我们不记得最新版本的commit id,git提供了git reflog命令来记录你的每一次命令。

Git撤销修改和删除

使用git checkout --  file_name  可以撤销对该文件的修改。如果文件已经add,但是没有提交,可以先用 git reset HEAD file_name,把暂存区的修改撤销掉,然后用git checkout – file_name 丢弃对工作区的修改

Git忽略特殊文件,在Git根目录下创建一个特殊的.gitignore文件

选择忽略文件的原则是:

1. 忽略操作系统自动生成的文件,比如缩略图等

2. 忽略编译生成的中间文件、可执行文件等

3. 忽略带有敏感信息的配置文件,比如存放口令的配置文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

Git远程仓库

在github上面创建一个git仓库,Github告诉我们,可以从这个仓库上克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到github仓库中去。远程仓库的默认名称为 origin,本地仓库的主分支默认名称为master

将本地仓库关联远程仓库的命令如下:

git remote add origin https://github.com/cherishui/learn_git.git        //关联远程库和本地库
git push -u origin master                                                          // 首次将本地库的所有内容推送到远程库上去

git push origin master                                                              // 将本地master分支推送到远程origin分支上

git remote 查看本地仓库锁链接的远程库信息(-v 查看更加详细的信息)

添加远程仓库: git remote add [name] [url]

删除远程仓库:  git remote rm [name]

修改远程仓库:  git remote set-url –push[name][newurl]

拉取远程仓库:$ git pull [remoteName] [localBranchName]

推送远程仓库:$ git push [remoteName] [localBranchName]

$ git push origin test:master          // 提交本地test分支作为远程的master分支 ,那么远程origin下面就会多了master分支
$ git push origin test:test              // 提交本地test分支作为远程的test分支

例如 git push origin master:Program  //是将本地master分支作为远程origin下面的名为Program的分支进行推送

git push origin :[name]                 //删除远程name分支

以后在本地分支的修改,只需要 git push origin master ,就可以将本地master分支的最新修改推送到GitHub分支上。

上述是先有本地库,后有远程库,如何将本地库关联远程库。下面介绍先有远程库,然后从远程库克隆到本地库来。

1. 现在github上面新建一个远程库,假设库名称为learn_git.git,在github页面上有相应的下载链接。

2. 然后本地新建一个文件夹,在文件夹中,执行 git clone git@github.com:cherishui/learn_git.git

我自己尝试用git协议下载库,下载失败,给出如下提示:

问题:没有在命令行中,添加操作的ssh公钥,因此显示没有权限操作。

解决三种方法:

第一种:通过ssh-keygen –C Email_addr –t rsa 生成密钥,将生成的id_rsa.pub告知GitHub,然后再通过git协议下载库就可以。

第二种:使用 https://github.com/cherishui/learn_git.git 协议下载就成功

第三种: 输入ssh git@github.com,如下图,

上述命令,表示本地已经信任git@github.com站点。

Git分支

Git最为人称道的功能,就是它强大的分支管理,无论是创建、切换和删除分支,Git在1秒钟之内就能够完成。

Git默认生产的分支叫做master分支。HEAD指针指向master,当master是当前分支时,HEAD就指向当前分支。

比如在当前的主分支master上,新建并且切换到dev分支后,Git内部创建了一个dev指针,并且指向master的位置,同时HEAD指针指向dev,表示当前工作分支在dev上。

如下图所示:

在dev分支,对工作区的修改和提交就是针对dev分支,每一次提交,dev分支往前移动一步,而master指针保持不变,如下图所示:

假如我们在dev上的开发工作完成,就可以将dev分支合并到master分支上去,git内部将master分支指向当前dev 的提交,就完成了合并。

完成dev分支上的开发,就可以删除dev分支,删除后的示意图如下:

创建dev分支               git branch dev             新分支创建后,不会自动切换到新分支去

切换到dev分支            git checkout dev

创建并且切换到dev分支  git checkout –b dev      新分支创建后,会自动切换到新分支去,相当于上面两个命令的集合

删除dev分支       git branch –d dev  默认情况下,没有合并的分支不能此命令删除,可以强行删除此分支 使用 git branch –D dev

查看本地分支      git branch

查看远程分支      git branch –r

如果是通过clone来下载一个库,再显示远程分支,会有如下显示:

创建远程分支      git push origin [name]

删除远程分支      git push origin : heads/[name]

合并分支dev到master : 先切换分支到master来,然后执行 git merge dev #将dev分支与当前分支合并。

使用—no--ff来合并分支 git merge --no-ff –m “修订记录” dev

Git鼓励大量使用分支,  高效且安全,本地分支和远程分支最好一致,保持开发的同步。

当分支合并有冲突时,通过git status来查看冲突文件情况,查看具体冲突的话,直接打开冲突文件就可以。

冲突实例:

根据实际需要,看是保留HEAD分支上的修改还是feature1分支上的修改,修改完毕后,必须重新add和commit。

合并完成后,删除feature1分支即可。

Git分支管理和多人协作

分支管理策略,在基于git的开发中,master分支应该是非常稳定的,仅用来发布新版本,平时不能在上面干活。开发时,都在dev分支上开发,等待开发稳定后,合并到master分支上,在master分支上发布1.0版本,建议在合并分支时,加上 –no--ff参数,以普通模式合并,合并后的历史log有分支的记录,这样可以清晰看到合并路线。

如果有bug的话,新建分支名称最好为 “bugfix-<bug编号>”,在此分支上修改, 修改好后,合并到本地master分支上。

如果同伴需要在远程origin库上的dev分支上开发,就必须创建远程origin库的dev分支到本地,使用如下步骤:

1.   git checkout –b dev origin/dev              #将远程库origin下的dev分支拷贝到本地

git checkout -b localBranchName origin/remoteBranchName ,在本地新建分支,并且与之关联到远程的分支,在这里,一般本地分支名称和远程分支名称设置成一样。

#在本地修改

git add && git commit –m “XXXX”

git push origin dev                  #将本地dev分支推送到远程库origin中去

如果自己在origin/dev分支上面也修改和提交了,在git push origin dev执行时,就会出现错误,解决方法很简单,

在本地,使用git pull把最新的提交从orgiin/dev上面抓取下来,在本地合并冲突后,在推送。

如果遇到:

那就是没有设置本地dev分支与远程origin/dev分支的链接。

在 git pull失败时,需要执行 git branch –set-upstream dev origin/dev #将本地dev分支与远程origin/dev分支建立链接

在 git pull出现合并冲突时,解决冲突,再次add和commit就可以。

或者新建一个分支,并且切换到此分支上,然后将本地分支与远程库的特定分支建立关联,使用命令 git checkout –b program

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin branch-name推送自己的修改;

  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

  3. 如果合并有冲突,则解决冲突,并在本地提交;

  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

这就是多人协作的工作模式,一旦熟悉,就非常简单。

一般来说,master分支是主分支,因此需要时刻与远程同步

dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要远程同步

bug分支只用于在本地修复bug,修复完成后,合并到自己的本地dev分支就可以。

feature分支是否推送到远程,取决于是否与他人合作开发一项新的功能。

Git暂存功能

当修复bug时,又不想失去当前在dev分支上已经进行开发的工作,可以使用git stash命令来把当前工作现场“存储”起来,等以后恢复现场后继续现在的工作。

git stash list 查看当前的缓存区

git恢复工作现场有两种方法,

方法一:git stash apply 恢复,但恢复后,stash内容并不删除,你需要用git stash drop来删除

方法二:git stash pop,在恢复的同时,把stash的内容删除

推荐使用方法二。

Git标签

Git的标签和commit类似,类似于里程碑标记。在git中打标签很简单,首先切换到需要打标签的分支上,

执行 git tag –a v0.1  -m “标签的注释” 就可以在最新提交的commit上面打标签

如果要给制定的commit打上标签,首先需要通过git log找到需要的 commit id,例如id为6224937, 则执行git tag <name> 6224937 。

git tag 来查看当前所有标签,git show <tagname>用来查看此次标签的详细提交信息。

git tag –d v0.1 删除v0.1的标签

git push origin <tagname> 推送某个标签到远程

git push origin –tags 可以一次性推送全部未推送过的本地标签到远程

如果标签已经推送到远程,要删除远程标签v0.9,需要两步,先从本地删除

git tag –d v0.9

然后,从远程删除,删除格式如下:

git push origin :refs/tags/v0.9

Git日志

git log 查看当前提交历史记录

git log --pretty=oneline  每条commit只显示一行字符

--graph              查看分支合并图

--abbrev-commit   缩写commit id

git配置别名

git config –global alias.st   status   # 将status参数简写为st

git config --global alias.co checkout

git config --global alias.ci  commit

git config --global alias.br  branch

git优化显示log 别名设置,下面是高手的设置

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配置文件存放在.git/config文件中。每个用户的git配置存放在用户主目录下的隐藏文件.gitconfigi中。

GitHub开源协作开发

如何参与一个开源项目呢?

1. 访问你感兴趣的项目的github主页,点击Fork,在自己账户下clone一个仓库

2. 然后在本地执行 git clone ,将自己账户下的此仓库拷贝下来,以bootstrap为例子说明:

如果你想修复bootstrap下的一个bug,立即在本地库上干活,干完后往自己的仓库推送。如果你希望bootstrap官方库能够接收你的修改,你可以在github上面发起一个pull request,表示向官方库推送修订请求。

搭建Git服务器

搭建Git服务器点此进入:搭建Git服务器

Git 技巧小结的更多相关文章

  1. PowerDesigner实用技巧小结(3)

    PowerDesigner实用技巧小结(3) PowerDesigner 技巧小结 sqlserver数据库databasevbscriptsqldomain 1.PowerDesigner 使用 M ...

  2. PowerDesigner实用技巧小结(2)

    PowerDesigner实用技巧小结 1.ORACLE数据库建模时,由于ORACLE的表名.字段名如果是小写会有一定的麻烦,需要将小写转化为大写? (1)在打开pdm的情况下,进入Tools-Mod ...

  3. Git技巧总结分享

    接触Git有很长一段时间了,从最初的不懂到逐渐熟悉运用,相比于SVN,更热衷于Git这一款强大的版本控制工具. 废话不多说,下面对Git做了一些技巧总结,在此分享下,希望能帮助到一些喜欢Git的朋友们 ...

  4. 转 git操作小结

    UNDER MIT LICENSE. 公司几乎所有的项目都是使用 git 仓库来管理代码,以前对 git 只有些肤浅的了解,每次提交代码或者上线的时候总是会提心吊胆,生怕出现一些未知的问题.经过三个月 ...

  5. Git技巧:右键菜单怎么去除?

    如果你是按照http://www.cnblogs.com/dunitian/p/5034624.html 那么你就没有这么多蛋疼的菜单了(反之:vs帮你安装的就蛋疼了) 说下解决方法: 1.Win+R ...

  6. git技巧记录--blame

    git blame [-L<m,n>] FilePath 可以查看代码每一行是谁写的(根据该行最后一次改动情况), -L表示要查看的行数范围, m: 起始行数, n:结束行数. 方便快速定 ...

  7. git技巧记录--子模块删除方法

    把子模块推进去了,删掉吧(将子模块删除,然后提交推送),删除子模块步骤: 1.在Platform.Web库下,右键->Git Bash,进入git命令行窗口,输入:git rm –-cached ...

  8. git merge 和 git rebase 小结

    Git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 同样 git rebase b,也是把 b分支合并到当前分支 ---------------------- ...

  9. Git学习小结(第三次作业)

    本文主要总结一下在学习和使用git中一些用到的命令. 参考教程:廖雪峰git教程 在windows上安装git 下载使用环境:http://msysgit.github.io/, 安装一路默认即可. ...

随机推荐

  1. 详细解读DialogFragment

    原博客地址:http://www.cnblogs.com/tianzhijiexian/p/4161811.html 相信看这篇文章的人都应该知道android中的Dialog了吧,如果对于Dialo ...

  2. Single Responsibility Principle 单一职责原则

  3. gitlab 安装

    GitLab的安装方式 GitLab的两种安装方法: 编译安装 优点:可定制性强.数据库既可以选择MySQL,也可以选择PostgreSQL;服务器既可以选择Apache,也可以选择Nginx. 缺点 ...

  4. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十】

    <Web 前端开发精华文章推荐>2013年第八期(总第二十期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  5. js json 对象相互转换

    字符串转对象(strJSON代表json字符串)   var obj = eval(strJSON);   var obj = strJSON.parseJSON();   var obj = JSO ...

  6. Leetcode 74 and 240. Search a 2D matrix I and II

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  7. autofac 注入普通服务和WCF服务

    using Autofac;using Autofac.Builder;using Autofac.Core; //实现Autofac扩展 public static AutofacRegisterW ...

  8. 循环执行n次的代码

    var audio = document.createElement("audio");  var index = 0;    audio.src = "piano/3C ...

  9. leetcode N-Queens/N-Queens II, backtracking, hdu 2553 count N-Queens, dfs 分类: leetcode hdoj 2015-07-09 02:07 102人阅读 评论(0) 收藏

    for the backtracking part, thanks to the video of stanford cs106b lecture 10 by Julie Zelenski for t ...

  10. 边工作边刷题:70天一遍leetcode: day 85-3

    Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...