git小结

首先让我们先看一下这张图
这里写图片描述
git近乎所有操作都是本地执行,时刻保持数据完整性,直接记录快照,而非差异比较

git配置

●/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用–system 选项,读写的就是这个文件。

●~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用–global 选项,读写的就是这个文件。

第一个要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:

  1. git config –global user.name “John Doe”
    2.git config –global user.email johndoe@ example.com

如果用了 –global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉–global 选项重新配置即可,新的设定保存在当前项目的.git/config 文件里。

修改已经提交的文件 (比如邮箱名字写错了) git commit –amend –author=”yinzhixiaxue name@email.com”(Name email)

文件的三种状态

好,现在请注意,接下来要讲的概念非常重要。对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库 中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。

由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。

这里写图片描述
图 1-6. 工作目录,暂存区域,以及本地仓库

基本的 Git 工作流程如下:

  1. 在工作目录中修改某些文件。 2. 对修改后的文件进行快照,然后保存到暂存区域。 3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。

所以,我们可以从文件所处的位置来判断状态:如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就 是已修改状态

git init 初始化git

从现有仓库克隆

如果想对某个开源项目出一份力,可以先把该项目的 Git 仓库复制一份出来,这就需要用到 git clone 命令。如果你熟悉其他的 VCS 比如 Subversion,你可能已经注意到这里使用的是 clone 而不是 checkout。这是个非常重要的差别,Git 收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。实际上,即便服务器的磁盘发生故障,用任何一个克隆出来 的客户端都可以重建服务器上的仓库,回到当初克隆时的状态

git clone [url]克隆仓库的命令,存的是是整个仓库

git status 要确定哪些文件当前处于什么状态
http://jbcdn2.b0.upaiyun.com/2012/08/20120201121432_845.png

实际上 git status 的显示比较简单,仅仅是列出了修改过的文件,如果要查看具体修改了什么地方,可以用 git diff 命令。稍后我们会详细介绍git diff,不过现在,它已经能回答我们的两个问题了:当前做的哪些更新还没有暂存?有哪些更新已经暂存起来准备好了下次提交? git diff 会使用文件补丁的格式显示具体添加和删除的行。

已修改,未暂存:git diff此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容

已暂存,未提交:git diff –cached 看已经暂存起来的文件和上次提交时的快照之间的差异(Git 1.6.1 及更高版本还允许使用git diff –staged,效果是相同的, 但更好记些。)

已提交,未推送:git diff master origin/master
相应的,下面是一些撤销修改(回滚代码)的操作

已修改,未暂存

git checkout .或者git reset –hard
已暂存,未提交

git reset git checkout .或者 git reset –hard
git reset 只是把修改退回到了 git add . 之前的状态,也就是说文件本身还处于 已修改未暂存 状态,你如果想退回 未修改 状态,还需要执行 git checkout . 。

或许你已经注意到了,以上两个步骤都可以用同一个命令 git reset —hard 来完成。是的,就是这个强大的命令,可以一步到位地把你的修改完全恢复到 未修改 的状态。

已提交,未推送
git reset –hard origin/master
还是这个 git reset —hard 命令,只不过这次多了一个参数 origin/master ,正如我们上面讲过的, origin/master 代表 远程仓库 ,既然你已经污染了你的 本地仓库 ,那么就从 远程仓库 把代码取回来吧。

已推送
很不幸,你的手实在是太快了,你既 git add 了,又 git commit 了,并且还 git push 了,这时你的代码已经进入 远程仓库 。如果你想恢复的话,还好,由于你的 本地仓库 和 远程仓库 是等价的,你只需要先恢复 本地仓库 ,再强制 push 到 远程仓库 就好了:

git reset –hard HEAD^
git push -f
下面是总结

git reset –hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除

git reset –hard HEAD~3:将最近3次的提交回滚

commit-id可以通过git log获得

忽略某些文件

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。

文件 .gitignore 的格式规范如下:

● 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。

● 可以使用标准的 glob 模式匹配。 * 匹配模式最后跟反斜杠(/)说明要忽略的是目录。 * 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9] 表示匹配所有 0 到 9 的数字)。

我们再看一个 .gitignore 文件的例子:
1.# 此为注释 – 将被 Git 忽略
2.*.a # 忽略所有 .a 结尾的文件
3.!lib.a # 但 lib.a 除外
4./TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
5.build/ # 忽略 build/ 目录下的所有文件
6.doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

git add 命令(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等)

git add . 和 git add -A 有什么区别

git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。

git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add –update的缩写)

git add -A :是上面两个功能的合集(git add –all的缩写)

git commit -m “啦啦啦”提交并添加说明的方式

   Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上-a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:

git commit -a -m ‘added new benchmarks’

移除文件

git rm 要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未 跟踪文件清单中了

git log 回顾下提交历史

git remote 命令,它会列出每个远程库的简短名字。在克隆完某个项目后,至少可以看到一个名为 origin 的远程库

git remote -v显示对应的克隆地址:

git remote add [shortname] [url]:添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用

git push [remote-name] [branch-name]

    如果要把本地的 master 分支推送到origin 服务器上(再次说明下,克隆操作会自动使用默认的 master 和 origin 名字),可以运行下面的命令:git push origin master

   只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那 你的推送操作就会被驳回。你必须先把他们的更新抓取到           本地,合并到自己的项目中,然后才可以再次推送

git remote show [remote-name] 查看某个远程仓库的详细信息

git remote rm [name] 移除对应的远端仓库

分支

git branch XXX新建分支

git checkout XXX 切换分支

git checkout -b XXX新建并切换到某分支,等于上面两句命令

       留心你的暂存区或者工作目录里,那些还没有提交的修改,它会和你即将检出的分支产生冲突从而阻止 Git 为你切换分支。应该先提交一下(),或者git stash一下

git merge合并分支,一般情况下,先git merge master,然后git merge XXX合并某分支,然后git branch -d XXX删除该分支

      遇到冲突时,手动解决冲突,然后再先build一下文件,之后再git add .,git  commit -m "",git push

git branch -d XXX 删除分支

git branch -D XXX 强制删除分支

git branch -v 查看各个分支最后一个提交对象的信息

当你在使用分支及合并的时候,一切都是在你自己的 Git 仓库中进行的 — 完全不涉及与服务器的交互

git push -u origin 设置推送到指定分支

git push [远程名] [本地分支]:[远程分支] 推送本地分支

git push [远程名] :[分支名] 删除远程分支

如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放稳定代码的地方),可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]。如果想在服务器上删除serverfix 分支,运行下面的命令:
1. git push origin :serverfix
2.To git@ github.com:schacon/simplegit.git
3.- [deleted] serverfix

咚!服务器上的分支没了。你最好特别留心这一页,因为你一定会用到那个命令,而且你很可能会忘掉它的语法。有种方便记忆这条命令的方法:记住我们不久前见过的 git push [远程名] [本地分支]:[远程分支] 语法,如果省略 [本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”。

git切分支快是因为并不像其他的分支管理系统那样对一个文件内容进行修改监测,git是每做一次修改就存一份快照,通过索引来指向。

在checkout分支之前,需要add和commit操作才行。

clone操作是把整个库拉回来,fetch是拉回某个分支。

git pull=git fetch+ git merge

git merge b 将b分支合并到当前分支

git rebase b 将b分支合并到当前分支

一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。

在进行衍合的时候,实际上抛弃了一些现存的提交对象而创造了一些类似但不同的新的提交对象。如果你把原来分支中的提交对象发布出去,并且其他人更新下载后在其基础上开展工作,而稍后你又用git rebase 抛弃这些提交对象,把新的重演后的提交对象发布出去的话,你的合作者就不得不重新合并他们的工作,这样当你再次从他们那里获取内容时,提交历史就会变得一团糟。

git mv old_file_name new_file_name 修改git文件名称或者修改文件的目录

还原操作

git show HEAD 显示上次提交信息, HEAD 在git中是指最新提交

git checkout HEAD 还原未添加到缓冲区的文件

git reset HEAD 还原添加到缓冲区的文件

git reset SHA 还原已经提交到某个版本的文件,前7位SHA位字符即可

git checkout 文件名 –theirs把本地仓库还原成对应的远程仓库

参考http://blog.jobbole.com/25775/
https://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651227335&idx=1&sn=54bbf426f7b8358fddcb4a3901255eb3&chksm=bd495d438a3ed45517ce21f33cdd457fb9201ba34d6723a1104df8a9bc0a934737f0df92f9a7&mpshare=1&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值