playerken

博客园 首页 新随笔 联系 订阅 管理

近乎所有操作都可本地执行

在Git中的绝大多数操作都只需要访问本地文件和资源,不用连网。

 

三种状态

对于任何一个文件,在 Git 内都只有三 种状态:已提交(committed),已修改(modified)和已暂存(staged)。

已提交表示该 文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保 存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。

                  

取得项目的Git仓库

从当前目录初始化

git init

初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都 存放在这个目录中。

从现有仓库克隆

git clone git://github.com/schacon/grit.git

这会在当前目录下创建一个名为 “grit” 的目录,其中内含一个 .git 的目录,并从同 步后的仓库中拉出所有的数据,取出最新版本的文件拷贝。如果希望在克隆 的时候,自己定义要新建的项目目录名称,可以在上面的命令最后指定。

 

记录每次更新到仓库

检查当前文件状态

git status

跟踪新文件

git add README

暂存已修改文件

git add README

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

现在的暂存区域已经准备妥当可以提交了。在此之前,请一定要确认还有什么修改过的 或新建的文件还没有git add 过,否则提交的时候不会记录这些还没暂存起来的变化。所以,每次准备提交前,先用git status 看下,是不是都已暂存起来了。

提交更新

git commit

提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。

尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。Git 提 供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。

移除文件

git rm README

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

如果删除之前修改过并且已经放到暂存 区域的话,则必须要用强制删除选项 -f。

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希 望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除,用 --cached 选项即可。

git rm --cached README

移动文件

git mv file_from file_to

在 Git 中对文件改名时可以这么用。

其实,运行 git mv 就相当于运行了下面三条命令:

$ mv README.txt README

$ git rm README.txt

$ git add README

查看历史

git log

 

撤消操作

修改最后一次提交

git commit --amend

此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,而所提交的文件快照和之前的一样。

如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交:

$ git commit -m 'initial commit'

$ git add forgotten_file

$ git commit --amend

上面的三条命令最终得到一个提交,第二个提交命令修正了第一个的提交内容。

取消已经暂存的文件

git reset HEAD <file>

文件又回到了之前已修改未暂存的状态。

取消对文件的修改

git checkout -- <file>

这条命令有些危险, 所有对文件的修改都没有了,因为我们刚刚把之前版本的文件复制过来重写了此文件。所以 在用这条命令前,请务必确定真的不再需要保留刚才的修改。

任何已经提交到 Git 的都可以被恢复。即便在已经删除的分支中的提交,或者用 --amend 重新改写的提交,都可以被恢复。所以,你可能失去的数据,仅限于没有提交过的,对Git 来说它们就像从未存在过一样。

 

远程仓库的使用

查看当前的远程库

git remote

它会列出每个远程库的简短 名字。在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用这个 名字来标识你所克隆的原始仓库。也可以加上 -v 选项,显示对应的克隆地址。

添加远程仓库

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

从远程仓库抓取数据

git fetch [remote-name]

此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。

如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以,git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以 来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓 库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

如果设置了某个分支用于跟踪某个远端仓库的分支,可以使 用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在 日常工作中我们经常这么用,既快且好。实际上,默认情况下 git clone 命令本质上就是 自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行 git pull,目的都是要从原始克隆的远端仓库中抓取数 据后,合并到工作目录中当前分支。

推送数据到远程仓库

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

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

查看远程仓库信息

git remote show [remote-name]

除了对应的克隆地址外,它还给出了许多额外的信息。它友善地告诉你如果是在 master 分支,就可以用 git pull 命令抓取数据合并到本地。另外还列出了所有处于跟踪状态中的 远端分支。它还会告诉我们,运行 git push 时缺省推送的分支是什么。

远程仓库的删除和重命名

git remote rename

git remote rm

Git工具

储藏(Stashing)

git stash

经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。stashing可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

为了往堆栈推送一个新的储藏,只要运行 git stash。这时,你可以方便地切换到其他分支工作;你的变更都保存在栈上。要查看现有的储藏,你可以使用 git stash list。

你可以重新应用你刚刚实施的储藏,所采用的命令就是git stash apply。如果你想应用更早的储藏,你可以通过名字指定它。

重写历史

如果你只想修改最近一次提交说明,这非常简单:
git commit --amend

如果你完成提交后又想修改被提交的快照,增加或者修改其中的文件,可能因为你最初提交时,忘了添加一个新建的文件,这个过程基本上一样。你通过修改文件然后对其运行git add或对一个已被记录的文件运行git rm,随后的git commit --amend会获取你当前的暂存区并将它作为新提交对应的快照。

posted on 2015-03-01 23:05  playerken  阅读(165)  评论(0编辑  收藏  举报