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