近乎所有操作都可本地执行
在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