1. git工作流程

这里的HEAD只是一个游标,它指向了当前版本库的最新版本

四个重要概念:

  • Workspace

    工作区:平时我们写代码的地方。

  • Index

    暂存区:写完代码后让它变成的待提交的状态。

  • Repository

    本地仓库:将暂存区的文件提交到这里,记录log并加入本地仓库管理。此时这些文件还处在本地,并没有上传到远程仓库

  • Remote

  • 远程仓库:将本地仓库修改的代码提交到远程仓库,可以供远程协作的人下载。常见的远程仓库托管平台有gitee、github等

2. 文件的四种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

  • Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.

  • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件

  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存区变成staged状态, 使用git checkout 则丢弃修改, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !

  • Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified

 #查看指定文件状态 
 git status [filename] 

 #查看所有文件状态 
 git status             

3. 忽略文件

有时候我们不想把某些文件纳入版本控制中,比如临时文件,缓存目录等等

在项目根目录创建.gitignore文件,

注释行用井号( # )

可以使用linux通配符。例如 星号( * )问号( ?)等

*.txt # 忽略所有txt文件

*.xml # 忽略所有xml文件

!lib.txt # 但lib.txt文件除外

build/ # 忽略当前目录下build目录下的所有文件

doc/*.txt # 仅忽略doc目录下的所有txt文件

下面列出常用命令:

基本命令

初始化git仓库
git init

添加文件到缓存区
git add [file]

将文件从工作区中删除
git rm [file]

将文件从缓存区中删除
git rm --cached [file]

查看仓库当前状态,显示有变更的文件,也可用用来看本地仓库的文件
git status 

将缓存区的内容提交到本地仓库
git commit -m “提交信息”

添加远程版本库
git remote add [shortname] [url]

显示远程仓库
git remote -v

下载远程仓库的代码到本地仓库并合并(避免推送时因为远程仓库的分支与本地的分支存在冲突而报错)
 git pull <远程主机名> <本地分支名>

删除远程仓库
git remote rm [name]

第一次推送远程你仓库
git push -u <远程主机名> <本地分支名>

推送到远程仓库
git push <远程主机名> <本地分支名>

克隆远程仓库到本地
git clone [url]

分支相关的命令
列出所有本地分支
git branch

列出所有远程分支
git branch -r

切换分支
git checkout [分支名]

新建一个分支,但依然停留在当前分支
git branch [新分支名]

新建一个分支,并切换到该分支
git checkout -b [新分支名]

合并指定分支到当前分支
git merge [指定分支]

删除分支
git branch -d [分支名]

删除远程分支
git push origin --delete [分支名]
git branch -dr [origin/分支名]

这里需要注意,第一次合并分支时,只是将我们指定分支合并到当前所在的分支,改变的只有当前所在的分支,而指定的分支并没有受到影响,也就是说,如果这时更改我们之前指定的分支,那么当前所在的分支也会受到影响, 所以git merge 翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。” 如果要使这两个分支完全一样,还需要切换到另一个分支,再执行一次git merge即可。

另外,这里附上一个可以边闯关边学习Git的网站,上面全是中文,跟着里面的指示一关一关的学,玩着玩着就把Git学会了,不过网速有点感人,需要耐心等待:学习Git

自我介绍