Git笔记

Posted encoreMiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git笔记相关的知识,希望对你有一定的参考价值。

Git笔记

一:知识点

1 Githug游戏通关流程-简书 :http://www.jianshu.com/p/482b32716bbe

有几个概念:

(1)Woking directory (对应changes not staged for commited)

(2)Staging area (对应changes to be commited)

(3)Repository

关于reset&checkout&revert

(1)用法:git reset HEAD 文件名,git checkout 文件名

应用情景:两个文件都被添加到staging area但是只想提交其中一个。

若使用reset一般情况下就是(1)Woking directory覆盖(2)Staging area 

而在(1)Woking directory中未修改时,则和checkout相同是(2)Staging area覆盖(1)Woking directory

(2)用法:

git reset —hard 直接将上一次修改抛弃

git  reset —soft 上一次修改放入(2)Staging area

git reset —mixed 上一次修改放入(1)Woking directory

git revert HEAD^1 (可选择要撤销的提交)只是撤销当前提交,之后的提交还会保留

(3)用法:git checkout commit id(reflog得到)

应用情景:可以恢复误操作

 

2 git使用简明指南:http://rogerdudler.github.io/git-guide/index.zh.html

三个工作树:工作区/index/HEAD

 

3 git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug,  先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。

基础命令:

$git stash

$do some work

$git stash pop

 

4 git的文件状态

状态1:

Untracked files:

  (use "git add <file>..." to include in what will be committed)

        .DS_Store

        BAFParking/

nothing added to commit but untracked files present (use "git add" to track)

操作1:

git add BAFParking

状态2:

Changes to be committed: //意思是在暂存区域生成了快照,等待被提交。注意,只有这个区域的文件才会被提交

  (use "git reset HEAD <file>..." to unstage)

        new file:   BAFParking

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)

  (commit or discard the untracked or modified content in submodules)

        modified:   BAFParking (modified content, untracked content)

 Untracked files:

  (use "git add <file>..." to include in what will be committed)

         .DS_Store

Git在未进行commit操作之前,存在三种状态:Untracked files,Changes not staged for commit及Changes to be committed,每种状态之间可以随意进行互相转换。了解这三种状态各自所对应的不同情况,能够帮助你方便有效的使用Git来管理项目。

 

5 关于.DS_Store?

存储文件夹的显示属性,譬如摆放位置等。

删除 .DS_Store

如果你的项目中还没有自动生成的 .DS_Store 文件,那么直接将 .DS_Store 加入到 .gitignore 文件就可以了。如果你的项目中已经存在 .DS_Store 文件,那就需要先从项目中将其删除,再将它加入到 .gitignore。如下:

删除项目中的所有.DS_Store。这会跳过不在项目中的 .DS_Store
1.find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
将 .DS_Store 加入到 .gitignore
2.echo .DS_Store >> ~/.gitignore
更新项目
3.git add --all
4.git commit -m \'.DS_Store banished!\'

如果你只需要删除磁盘上的 .DS_Store,可以使用下面的命令来删除当前目录及其子目录下的所有.DS_Store 文件:

find . -name \'*.DS_Store\' -type f -delete。

 

禁止.DS_store生成:

defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE

恢复.DS_store生成:
defaults delete com.apple.desktopservices DSDontWriteNetworkStores

 

.gitignore文件用于忽略文件,其规范如下:(.gitignore文件可根据团队情况或是个人喜好可提交可不提)

1.所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
2.可以使用标准的 glob 模式匹配。
3.匹配模式最后跟反斜杠(/)说明要忽略的是目录。
4.要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

glob模式要点:

  1. *:任意个任意字符, 
  2. []:匹配任何一个在方括号中的字符, 
  3. ?:匹配一个任意字符, 
  4. [0-9]:匹配字符范围内所有字符

所以,我们只需要在对应的Git目录下,创建一个.gitignore文件,然后配置上.DS_Store即可,步骤如下:
1.命令行下使用touch .gitignore创建.gitignore文件(已有的直接到第二步)
wdw:test wdw$ touch .gitignore
2.open .gitignore,输入.DS_Store 换行再输入*/.DS_Store

3.保存即可生效,这里是忽略了当前目录的.DS_Store以及其子目录的.DS_Store 

这样问题就解决了么?并没有,因为在今后的使用中,我发现我需要在所有Git目录下加这样的.gitignore配置,心都操碎了。有没有办法可以全局配置呢?让这个配置对所有的Git目录都生效。git config可以帮到我们。

 

git config --list命令可以让你查看现有的配置,(在这里我们就先忽略其他的配置项了,有兴趣的同学可以戳这里做更多的了解)实际上它是一个文件,文件的位置在用户根目录,名称是.gitconfig。以下是添加全局忽略文件的步骤:

  1. 创建~/.gitignore_global文件,把需要全局忽略的文件写入该文件,语法和.gitignore一样
  2. ~/.gitconfig中引入.gitignore_global文件
    [core] 
    excludesfile = /Users/reon/.gitignore_global 
    也可以通过git config --global core.excludesfile/Users/reon/.gitignore_global命令来实现 
  3. 配置成功,可以去验证是否生效了 

到这里,忽略文件的操作已经搞定了.

 

6 从git中删除指定的文件和目录

$ git rm -r 我的文件夹/

此处-r表示递归所有子目录,如果你要删除的,是空的文件夹,此处可以不用带上-r。或是删除的是文件也不带r。

提交代码 

$ git commit -m"我的修改"

 

git - 移除文件以及取消对文件的跟踪

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

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 “Changes not staged for commit” 部分(也就是未暂存清单)看到:

$ rm grit.gemspec

$ git status

On branch master

Changes not staged for commit:

  (use "git add/rm <file>..." to update what will be committed)

  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    grit.gemspec

no changes added to commit (use "git add" and/or "git commit -a")

然后再运行 git rm 记录此次移除文件的操作:

$ git rm grit.gemspec

rm \'grit.gemspec\'

$ git status

On branch master

Changes to be committed:

  (use "git reset HEAD <file>..." to unstage)

        deleted:    grit.gemspec

最后提交的时候,该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可:

$ git rm --cached readme.txt

后面可以列出文件或者目录的名字,也可以使用 glob 模式。比方说:

$ git rm log/\\*.log

注意到星号 * 之前的反斜杠 \\,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。)。此命令删除所有 log/ 目录下扩展名为 .log 的文件。类似的比如:

$ git rm \\*~

会递归删除当前目录及其子目录中所有 ~ 结尾的文件。

取消对文件的跟踪还有一个命令:git update-index --assume-unchanged <取消跟踪的文件>
注:该命令只能取消提交到暂存区之前的文件,可以先用git reset <文件名>将暂存区的文件回退到暂存区之前,然后再取消跟踪。

 

 

7 git中的撤销操作(撤销修改,撤销新建,撤销add,撤销commit)

撤销对文件的修改

如你修改了文件,但是不想保存对文件的修改。(not staged for commit)

根据具体情况,你可以选择执行下面的命令:

git checkout -- <文件名>  #撤销对某个文件的修改

git checkout -- .  #撤销对所有文件的修改

 

删除新建的文件

如下图所示的情况,注意"Untracked files"提示,你新建了文件,但是想删除掉新建的文件。

根据具体情况,你可以选择执行下面的命令:

git clean -f   #删除 untracked files

git clean -fd  #连 untracked 的目录也一起删掉  

git clean -n  #在用上述 git clean前,强烈建议先执行git clean -n 看看会删掉哪些文件,防止重要文件被误删

不过你也可以直接简单粗暴,手动删除或者执行window的rm命令,删除文件,不过执行git rm命令是没法做到的,必须先add,然后执行git rm -f <文件名>强制删除文件。。。。

 

撤销暂存区文件

如你想撤销add命令添加到暂存区的文件。(changes to be commited)

根据具体情况,你可以选择执行下面的命令:

git reset head <文件名>   #撤销对某个文件的add命令

git reset head .  #撤销所有文件的add命令

 

撤销已暂存的文件:

你想撤销commit命令,你可以执行下面的命令:

git log  #先执行这条命令查看commit的历史

git reset --hard <commit_id> #跳到某次commit

 撤销之后,由于本地版本低于线上版本,想要提交代码,只能强行提交,覆盖线上,可以使用下面的命令:

git push -f origin 分支名

注意:

  1. 命令行中的空格
  2. 其实上面的命令,在Git的命令行窗口中差不多都有提示。

 

 

二:遇到的问题

注意提交用代码

git commit -a -m"first commit" 

 

 

三 未读的博客

1 读懂diff:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html

2 checkout命令详解:http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html?utm_source=tuicool&utm_medium=referral

3 廖雪峰git教程 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

4 深入理解git工作流:http://www.jianshu.com/p/91acec85c3a4

5 git忽略规则.gitignore处理:http://www.cnblogs.com/kevingrace/p/5690241.html

6 vim 保存退出:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html

7 初次运行git前的配置gitcofig有关:https://git-scm.com/book/zh/v1/起步-初次运行-Git-前的配置

 

 

 

小结:

1.git init      -------创建空的版本库;

2.git add       -------添加文件到暂存区;

3.git commit      -------提交文件到版本库(仓库);

4.git status      -------查看相关状态;

5.git diff      -------查看具体修改的内容;

6.git log      -------查看提交历史记录;

7.git reset      -------回到上一版本;

8.git reflog      -------查看命令历史记录;

9.git checkout      -------丢弃工作区的修改;

10.git rm      -------删除文件;

 

以上是关于Git笔记的主要内容,如果未能解决你的问题,请参考以下文章

Git学习笔记

Git学习笔记

Git学习笔记4

Git 学习笔记

git 笔记

git学习笔记