## Git 简介html
Git 是一种代码管理方式,用于多人协做开发。Git 有以下特色:vue
- 分布存储在多台电脑上git
- 任意两个开发者之间能够很容易的解决冲突。github
- 离线工做web
Pro Git(中文版) 返回 码云
目录api
返回码云 | Git 官方网站 | Git 手册 | Pro Git 源码服务器
http://git.oschina.net/progit/3-Git-%E5%88%86%E6%94%AF.html#3.4-%E5%88%A9%E7%94%A8%E5%88%86%E6%94%AF%E8%BF%9B%E8%A1%8C%E5%BC%80%E5%8F%91%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B网络
1.配置用户信息app
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com编辑器2.查看配置信息
$ git config --list
3.获取帮助
git help config
4.对现有的某个项目用git进行管理
git init
5.从现有的仓库克隆
git clone [url]
6.查看当前文件状态
git status
7.跟踪新文件
git add . //跟踪全部的新文件,并处于暂存状态
git add 1.txt //跟踪某个新文件,并处于暂存状态
8.查看具体修改了什么地方
git diff //此命令只能查看已修改但未暂存起来的变化内容
git diff --staged 或 git diff --cached //此命令只能查看暂存起来的文件的内容变化
9.提交更新
git commit
git commit -m 'xxxx' //加-m参数后此命令可跟提交说明方式
git commit -a -m 'xxxx' //加 -a参数后此命令会自动把已经跟踪过的文件暂存起来一并提交,跳过使用暂存区域(注意:新添加的文件却不能用此命令)
10.移除文件
git rm --cached b.vue //从暂存区中移除某个文件,但工做目录中仍然存在
git rm -f b.vue //强制删除某个文件,工做目录中也删除掉
11.查看提交历史
git log //不带任何的参数,按提交时间列出全部的更新,最近的排在最上面
git log -p //选项展开显示每次提交的内容差别
git log -2 //仅展现最近的两次更新
git log --pretty=oneline //将每一个提交放在一行显示,这在提交数很大时很是有用
12.撤销操做
(1)修改最后一次提交
有时候咱们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操做,可使用
--amend
选项从新提交:git commit --amend
此命令将使用当前的暂存区域快照提交。若是刚才提交完没有做任何改动,直接运行此命令的话,至关于有机会从新编辑提交说明,但将要提交的文件快照和以前的同样。
启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交。
若是刚才提交时忘了暂存某些修改,能够先补上暂存操做,而后再运行
--amend
提交:git commit -m 'lg'
git add .
git commit --amend
上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。
(2)取消已经暂存的文件
接下来的两个小节将演示如何取消暂存区域中的文件,以及如何取消工做目录中已修改的文件。不用担忧,查看文件状态的时候就提示了该如何撤消,因此不须要死记硬背。来看下面的例子,有两个修改过的文件,咱们想要分开提交,但不当心用
git add .
全加到了暂存区域。该如何撤消暂存其中的一个文件呢?其实,git status
的命令输出已经告诉了咱们该怎么作:$ git add .
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.txt
# modified: benchmarks.rb就在 “Changes to be committed” 下面,括号中有提示,可使用
git reset HEAD <file>...
的方式取消暂存。好吧,咱们来试试取消暂存 benchmarks.rb 文件:$ git reset HEAD benchmarks.rb
benchmarks.rb: locally modified
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.txt
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: benchmarks.rb这条命令看起来有些古怪,先别管,能用就行。如今 benchmarks.rb 文件又回到了以前已修改未暂存的状态。
13.远程仓库的使用
要参与任何一个 Git 项目的协做,必需要了解该如何管理远程仓库。远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些能够写。同他人协做开发某个项目时,须要管理这些远程仓库,以便推送或拉取数据,分享各自的工做进展。管理远程仓库的工做,包括添加远程库,移除废弃的远程库,管理各式远程库分支,定义是否跟踪这些分支,等等。本节咱们将详细讨论远程库的管理和使用。
(1)查看当前的远程库
要查看当前配置有哪些远程仓库,能够用
git remote
命令,它会列出每一个远程库的简短名字。在克隆完某个项目后,至少能够看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库:$ git clone git://github.com/schacon/ticgit.git Initialized empty Git repository in /private/tmp/ticgit/.git/ remote: Counting objects: 595, done. remote: Compressing objects: 100% (269/269), done. remote: Total 595 (delta 255), reused 589 (delta 253) Receiving objects: 100% (595/595), 73.31 KiB | 1 KiB/s, done. Resolving deltas: 100% (255/255), done. $ cd ticgit $ git remote origin也能够加上
-v
选项(译注:此为--verbose
的简写,取首字母),显示对应的克隆地址:$ git remote -v origin git://github.com/schacon/ticgit.git若是有多个远程仓库,此命令将所有列出。好比在个人 Grit 项目中,能够看到:
$ cd grit $ git remote -v bakkdoor git://github.com/bakkdoor/grit.git cho45 git://github.com/cho45/grit.git defunkt git://github.com/defunkt/grit.git koke git://github.com/koke/grit.git origin git@github.com:mojombo/grit.git这样一来,我就能够很是轻松地从这些用户的仓库中,拉取他们的提交到本地。请注意,上面列出的地址只有 origin 用的是 SSH URL 连接,因此也只有这个仓库我能推送数据上去(咱们会在第四章解释缘由)。
(2)添加远程仓库
要添加一个新的远程仓库,能够指定一个简单的名字,以便未来引用,运行
git remote add [shortname] [url]
:$ git remote origin $ git remote add pb git://github.com/paulboone/ticgit.git $ git remote -v origin git://github.com/schacon/ticgit.git pb git://github.com/paulboone/ticgit.git如今能够用字符串
pb
指代对应的仓库地址了。好比说,要抓取全部 Paul 有的,但本地仓库没有的信息,能够运行git fetch pb
:$ git fetch pb remote: Counting objects: 58, done. remote: Compressing objects: 100% (41/41), done. remote: Total 44 (delta 24), reused 1 (delta 0) Unpacking objects: 100% (44/44), done. From git://github.com/paulboone/ticgit * [new branch] master -> pb/master * [new branch] ticgit -> pb/ticgit如今,Paul 的主干分支(master)已经彻底能够在本地访问了,对应的名字是
pb/master
,你能够将它合并到本身的某个分支,或者切换到这个分支,看看有些什么有趣的更新。(3)从远程仓库抓取数据
正如以前所看到的,能够用下面的命令从远程仓库抓取数据到本地:
$ git fetch [remote-name]此命令会到远程仓库中拉取全部你本地仓库中尚未的数据。运行完成后,你就能够在本地访问该远程仓库中的全部分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。(咱们会在第三章详细讨论关于分支的概念和操做。)
若是是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。因此,
git fetch origin
会抓取从你上次克隆以来别人上传到此远程仓库中的全部更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,须要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工做分支,只有当你确实准备好了,才能手工合并。若是设置了某个分支用于跟踪某个远端仓库的分支(参见下节及第三章的内容),可使用
git pull
命令自动抓取数据下来,而后将远端分支自动合并到本地仓库中当前分支。在平常工做中咱们常常这么用,既快且好。实际上,默认状况下git clone
命令本质上就是自动建立了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。因此通常咱们运行git pull
,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工做目录中的当前分支。(4)推送数据到远程仓库
项目进行到一个阶段,要同别人分享目前的成果,能够将本地仓库中的数据推送到远程仓库。实现这个任务的命令很简单:
git push [remote-name] [branch-name]
。若是要把本地的 master 分支推送到origin
服务器上(再次说明下,克隆操做会自动使用默认的 master 和 origin 名字),能够运行下面的命令:$ git push origin master只有在所克隆的服务器上有写权限,或者同一时刻没有其余人在推数据,这条命令才会如期完成任务。若是在你推数据前,已经有其余人推送了若干更新,那你的推送操做就会被驳回。你必须先把他们的更新抓取到本地,合并到本身的项目中,而后才能够再次推送。有关推送数据到远程仓库的详细内容见第三章。
(5)查看远程仓库信息
咱们能够经过命令
git remote show [remote-name]
查看某个远程仓库的详细信息,好比要看所克隆的origin
仓库,能够运行:$ git remote show origin * remote origin URL: git://github.com/schacon/ticgit.git Remote branch merged with 'git pull' while on branch master master Tracked remote branches master ticgit除了对应的克隆地址外,它还给出了许多额外的信息。它友善地告诉你若是是在 master 分支,就能够用
git pull
命令抓取数据合并到本地。另外还列出了全部处于跟踪状态中的远端分支。上面的例子很是简单,而随着使用 Git 的深刻,
git remote show
给出的信息可能会像这样:$ git remote show origin * remote origin URL: git@github.com:defunkt/github.git Remote branch merged with 'git pull' while on branch issues issues Remote branch merged with 'git pull' while on branch master master New remote branches (next fetch will store in remotes/origin) caching Stale tracking branches (use 'git remote prune') libwalker walker2 Tracked remote branches acl apiv2 dashboard2 issues master postgres Local branch pushed with 'git push' master:master它告诉咱们,运行
git push
时缺省推送的分支是什么(译注:最后两行)。它还显示了有哪些远端分支尚未同步到本地(译注:第六行的caching
分支),哪些已同步到本地的远端分支在远端服务器上已被删除(译注:Stale tracking branches
下面的两个分支),以及运行git pull
时将自动合并哪些分支(译注:前四行中列出的issues
和master
分支)。(6)远程仓库的删除和重命名
在新版 Git 中能够用
git remote rename
命令修改某个远程仓库在本地的简称,好比想把pb
改为paul
,能够这么运行:$ git remote rename pb paul $ git remote origin paul注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的
pb/master
分支如今成了paul/master
。碰到远端仓库服务器迁移,或者原来的克隆镜像再也不使用,又或者某个参与者再也不贡献代码,那么须要移除对应的远端仓库,能够运行
git remote rm
命令:$ git remote rm paul $ git remote origin
(7)有关分支
git branch #列出全部本地分支
git branch -r #列出全部远程分支
git branch -a #列出全部分支(包括本地和远程)
git branch [分支名] #添加一个本地分支,但不切换
git checkout [分支名] #切换到该分支上
git checkout -b [分支名] #新建一个分支,并切换到这个分支上,至关于执行 git branch [分支名] 和 git checkout [分支名] 这两步
git push origin [本地分支]:[远程分支] #新建一个远程分支,并把本地分支上的代码推送到新建的远程分支上
git branch -d [分支名] #删除本地分支
git push origin -d [分支名] #删除远程分支
git merge [某分支名] #把某分支上的代码合并到当前分支上
(8)版本回退
在git中,用'HEAD'表示当前版本,也就是最新提交的版本;
上一个版本就是'HEAD^',上上一个版本就是'HEAD^^'
git reset --hard HEAD^ #从当前版本回退到上一个版本
git reset --hard HEAD^^ #从当前版本回退到上上一个版本
git reset --hard [版本号的前几位] #从当前版本回退到指定版本,例如:git reset --hard 1094a (不必写全前几位就能够);
在Git中,老是有后悔药能够吃的。当你用
$ git reset --hard HEAD^
回退到add distributed(上一次版本)
版本时,再想恢复到append GPL(最近的一次版本)
,就必须找到append GPL
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:liujianguodeMacBook-Pro:gitweb liujianguo$ git reflog b1ac482 (HEAD -> master) HEAD@{0}: reset: moving to b1ac4825 f1c173c HEAD@{1}: reset: moving to HEAD^ b1ac482 (HEAD -> master) HEAD@{2}: reset: moving to HEAD b1ac482 (HEAD -> master) HEAD@{3}: commit: lg f1c173c HEAD@{4}: commit: lg df801e9 HEAD@{5}: commit (initial): lg(8)撤销修改
命令
git checkout -- readme.txt
意思就是,把readme.txt
文件在工做区的修改所有撤销,这里有两种状况:一种是
readme.txt
自修改后尚未被放到暂存区,如今,撤销修改就回到和版本库如出一辙的状态;一种是
readme.txt
已经添加到暂存区后,又做了修改,如今,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另外一个分支”的命令