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模式要点:
- *:任意个任意字符,
- []:匹配任何一个在方括号中的字符,
- ?:匹配一个任意字符,
- [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。以下是添加全局忽略文件的步骤:
- 创建~/.gitignore_global文件,把需要全局忽略的文件写入该文件,语法和.gitignore一样
- 在~/.gitconfig中引入.gitignore_global文件
[core]
excludesfile = /Users/reon/.gitignore_global
也可以通过git config –global core.excludesfile/Users/reon/.gitignore_global命令来实现 - 配置成功,可以去验证是否生效了
到这里,忽略文件的操作已经搞定了.
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 分支名
注意:
- 命令行中的空格
- 其实上面的命令,在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 ——-删除文件;