Git使用说明
1. 创建git项目
使用git的第一步是创建一个git项目。这一步需要在github网站上完成,在网站中创建一个全新的repository。如果我们之前在本地完成一个项目,想要将该项目发布到github,则此时新建的repository不要有任何文件,即使是README这样的文件,然后我们可以按照如下流程完成创建:
a) cd localproject
b) git init
c) git add * //将目录下所有的文件添加到git项目中;
d) git commit –m “add a message”;
e) git remote add origin https://github.com/username/***.git
f) git push origin master.
上述步骤完成之后,我们本地的项目就上传到github下指定的repository下。在一开始我们提到,不要在创建repository时添加任何文件,否则我们不能正常提交,因为github上的初始版本和本地版本不一致。
如果我们是要对上述项目做二次开发,则我们可以从github网站上下载该项目,然后本地修改。流程如下:
a) git clone https://github.com/username/***.git newdirectory
b) cd newdirectory
c) modify some files
d) git commit –a “modify theproject”// shorthand for “add and commit”
e) git push origin master
流程第一步是从github上clone一个项目到本地,然后我们做修改,最后再提交。
上述流程就是很多博客中说的1分钟学会github托管。但是只会上面的操作不足以应对平时的各种需求,我们还需要进一步了解git。
2. git的状态转换
针对本地的一个项目,如果不是从github上下载,则所有文件一开始都属于untracked状态,否则都属于tracked状态。属于 untracked状态的文件,如果我们不将其添加到git中,任意的修改都不会影响git状态。所以如果是我们想要保存到git中的文件,我们首先要将其添加到git中,命令就是git add。添加之后的文件就属于tracked状态。tracked状态本身又有三个子状态:modified,staged和committed。一个未经修改的文件被添加到git中之后将会是staged状态,此时我们运行git commit将会使这个文件变为committed状态。变为committed状态之后,git就为该项目生成了一个snapshot,我们就可以将其 push到github中。一个被commit的文件如果被修改,其状态又会变为modified状态,等待新的add和commit。如果我们想将一个文件从项目中除名,可以采用git rm命令。不加--cached参数的rm命令将会物理删除文件,添加该选项将会把文件从git项目中删除,但是不物理删除。文件的状态也变为 untracked状态。git中文件状态转换关系如下图:
图1 git文件的状态转换
3. git文件过滤
在项目开发过程中,会存在很多临时文件,比如备份文件~、和对象文件.o等等。这些文件无需添加到git中。我们可以在工程根目录下设置一个.gitignore文件指明无需添加的文件。该文件内容很简单:
*.o #表示忽略目标文件
*~ #表示忽略备份文件
.* #表示忽略隐藏文件
通过设定该文件,当我们用git add 添加一个目录时,会自动忽略掉符合上面规则的所有文件。
4. 远程协作
当我们采用git clone从远程下载一个项目时,git会为我们这个项目自动添加一个远程repository,名为origin。我们还可以通过命令:git remote add [shortname] [url]来添加新的repository作为我们下载上传的目标。下载时我们可以采用git clone/fetch/pull来完成。上传时采用git push [remote-name] [branch-name]完成。
5. 回滚
回滚操作可以让我们回归到之前的版本,取消错误的commit。主要有两种方式:revert和reset。git revert 命令会通过一个新的commit 来使仓库倒退一个commit。执行git revert cc3a9d3a5820b16bca3c1761efb5885b90371e94被回滚到hash值所在的commit。git reset是指将当前head的内容重置,不会留任何痕迹。执行git reset d5bb1731bf32fb62dc7eedc573da41fa31e27151 --hard 会直接回到hash值那时的commit状态,之后发生了什么都不会出现在commit log里。