(Git) – Git入门

1.安装Git,详见大佬的博客:安装Git

注意千万不要用Windows 自带的记事本编辑代码文件,这样会有换行的问题。Unix系列的文本在Windows 下看上去都是一行。需要用一些软件处理一下。

2.版本库repository:在Bash下,cd到版本库的目录,然后使用git init初始化。

3.添加文件到暂存区git add <file>;确认修改(将快照放到工作区):git commit或者git commit -m "修改的信息"。如果想一次性提交试试:git commit -a -m "xxx"

git add -A // 添加所有改动
git add * // 添加新建文件和修改,但是不包括删除
git add . // 添加新建文件和修改,但是不包括删除
git add -u // 添加修改和删除,但是不包括新建文件

4.查看修改的信息:git diff

5.如果需要检查版本库的状态:git status

6.版本回退的命令:

  • 查看commit的日志:git log [--pretty=oneline] 显示提交日志,完整版本号。是否显示为一行。
  • 回退某次提交:git reset --hard id | HEAD^ | HEAD~Number
  • 每次reset会重新更改HEAD的指针,HEAD^表示的就是当前HEAD的父级。

7.工作区和暂存区:

  • 工作区(Working Directory):就是你在电脑里能看到的目录,比如test文件夹就是一个工作区。
  • 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
  • 所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

    git diff #是工作区(work dict)和暂存区(stage)的比较
    git diff --cached #是暂存区(stage)和分支(master)的比较

  • 有点儿像购物车:每次把买的东西添加(add)到购物车(暂存区),然后结一次帐(commit)放到历史购物车中。

8.暂存区修改:

  • 第一次修改 -> git add -> 第二次修改 -> git commit。原文提到第二次的修改不会提交。但是在Windows下Git是会提交第二次修改的。如果不一致的话可硬这样做:第一次修改 -> git add -> 第二次修改 -> git add -> git commit
  • 如果不确定,可以通过命令git diff HEAD -- file来查看不同

9.撤销修改:

  • 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
  • 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了上一种情况。
  • 回退版本重置一下。
  • checkout和reset:(摘自dalao的评论)

文件层面:

  • git add files 把当前文件放入暂存区域。
  • git commit 给暂存区域生成快照并提交。
  • git reset -- files 用来撤销最后一次git add files,你也可以用git reset 撤销所有暂存区域文件。
  • git checkout -- files 把文件从暂存区域复制到工作目录,用来丢弃本地修改。

checkout命令用于从历史提交(或者暂存区域)中拷贝文件到工作目录,也可用于切换分支。当给定某个文件名时,git会从指定的提交中拷贝文件到暂存区域和工作目录。比如,git checkout HEAD~ foo.c会将提交节点HEAD~(即当前提交节点的父节点)中的foo.c复制到工作目录并且加到暂存区域中。(如果命令中没有指定提交节点,则会从暂存区域中拷贝内容。)注意当前分支不会发生变化。

当不指定文件名,而是给出一个(本地)分支时,那么HEAD标识会移动到那个分支(也就是说,我们“切换”到那个分支了),然后暂存区域和工作目录中的内容会和HEAD对应的提交节点一致。新提交节点(下图中的a47c3)中的所有文件都会被复制(到暂存区域和工作目录中);只存在于老的提交节点(ed489)中的文件会被删除;不属于上述两者的文件会被忽略,不受影响。

如果既没有指定文件, 也没有指定分枝. 而是只给出一段提交的历史Hash, 只有HEAD会移动到相应的历史提交. 这会造成HEAD分离, 非常危险的操作, 这个命令的说明只是为了满足你的好奇心而已, 不要使用这个命令。

reset命令把当前分支指向另一个位置,并且有选择的变动工作目录和索引。也用来在从历史仓库中复制文件到索引,而不动工作目录。如果不给选项,那么当前分支指向到那个提交。如果用--hard选项,那么工作目录也更新,如果用--soft选项,那么都不变。

如果没有给出提交点的版本号,那么默认用HEAD。这样,分支指向不变,但是索引会回滚到最后一次提交,如果用--hard选项,工作目录也同样。

10.删除文件:git rm。恢复的话,可以使用checkout 恢复到上一次commit的版本。

11.远程仓库:

  • 首先需要创建一个SSH的公钥和私钥:ssh-keygen -t rsa -C "youremail@example.com"。然后进入~目录(用户的目录)的.ssh,把id_rsa.pub中的公约内容复制到Github的添加SSH Key界面中。
  • GitHub创建一个仓库。这个不多说,然后git remote add origin git@github.com:<username>/<project_name>.git创建一个初始的版本。
  • 推送必要修改:git push origin master

12.从远程库克隆:git clone git@github.com:<username>/<project_name>.git

参考:整理自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000