概念
- 工作目录:当前所见,Working directory
- 暂存区域:以后要提交到仓库的文件,称为Index或者staging area
- Git 仓库:持久化存储快照的地方,HEAD指针所指向的地方
Git 基本工作流程:
- 修改文件,会被git觉察
- 手动选择修改过的文件以暂存文件。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
git 设置命令
1.git config
设置本地用户信息
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
如果使用了 --global 选项,就是全局设置的。
2.git config --list
列出所有 Git 的配置选项
3.git help [你想了解的git命令]
,获得详细解释
git 暂存操作命令
1.git init
创建仓库
2.git status
查看git状态
创建或修改文件,会被git发现差异,git status
可以查看这些变动
3.git add [fileName]
暂存或追踪文件
git statu查看git状态是查看的当前git所追踪的文件的变动状态,之所以git不自动追踪所有文件的原因是给用户的选择空间。所以才有暂存的存在,暂存过的文件就会被git做diff比较,进而可以将暂存区的内容存入仓库。加入暂存这一操作,被git称作追踪track。所以追踪一个文件和暂存一个文件本质区别不大。所以都适用git add一个命令完成。如果你不知道哪些需要增加到暂存,git status会告诉你
想要增加更多或者全部文件,可以使用git add *或.或-A或-all,如果想要配置不需要追踪的文件,可以在仓库跟目录下创建.gitignore,来看一个实际的例子:
$ cat .gitignore
*.[oa]
*~
第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。 第二行告诉 Git 忽略所有以波浪符(~)结尾的文件
4.git checkout [fileName]
从暂存区取回并替换工作区文件
5.git reset [fileName]
删除暂存区的内
6.git diff fileName
查看改了具体内容
总结:暂存一方面起到临时保存的作用,还有追踪的作用。通过暂存,可以简单的保存,但是作用有限 ,比如,你暂存了某个文件并再次做了修改,如果你从暂存区checkout后,你就再也找不到最新修改的部分了。并且,如果你多次暂存了这个文件,暂存区只有最近一次暂存状态,你不能查看前几次修改的快照。所以对此需求,就需要将快照持久化,也就是commit提交到仓库。
对git来说,有如上流程,add the file, edit the file, stage the file,remove the file我们已经说过,完整commit提交后,原本暂存区中保存的修改了的内容就会被清空,git会认为当前是环境是干净的,没有被修改过的,原因有二:
1.既然已经将修改持久化保存,就算清空暂存区也不会出错。
2.如果暂存区不会清空,就可以无限提交,显然这是不被允许的。
git 仓库操作命令
1.git commit -m '提交时的文字描述'
该命令可以提交暂存区内容到仓库,也就是将暂存区的内容持久化保存为仓库中的快照,成功提交后,git将打印这次提交的快照的索引号,如果你愿意的话可以记住,很多gui工具都不需要你记,有些时候,如果你觉得先把修改提交到暂存区再提交到仓库多此一举,实际上可以一步直接将修改提交到仓库
git commit -a -m '提交时的文字描述'
2.git mv old new
如果你移动了或者重命名了一个文件,git就认为这是新的,实际上,我们想让git知道这是仓库中的文件而不是新文件你需要git mv README.md README
,为什么要让git知道呢?
a.如果git不知道,那就认为是新文件,
b.如果git不知道,在多人合作时,合并代码就会出问题
3.git log
查看历史提交
如果你只想看最近两次的历史,使用git log -2
,
如果想看历史详细差异,git log -p
精炼的查看历史信息,git log --pretty=format:"%h - %an, %ar : %s"
,
--graph
可以可视化展示分支图
git reflog
查看历史操作,用于挽尊
4.git commit -amend '提交时的文字描述'
重新提交
有时你在某次提交后,发现漏提交了一些文件,或是某次提交信息不够完善,总之你想重新编辑这次提交,你可以做完一系列操作后使用这个命令
5.git reset --hard/soft/mix [索引号]
. 切换到某一次提交
但凡你不知道你在做什么,请操作之前一定提交后推送到远程,在工作目录保持干净的情况下在使用这个命令。git reset file
,会将暂存区的file删去,也可以git reset 清空暂存区git reset commit file
,如果commit不是head,将commit的file 放入暂存区
6.git rm --cached [fileName]
删除取消追踪仓库中的某个文件
如果想删除仓库和本地目录的文件git rm
7.git update-index --assume-unchanged file 不再追踪本地某文件,而不删除仓库中的文件
8.git revert commit 撤销某次提交
可以把他看成快照head与快照head-某次commit的合并,而且会出现奇怪的冲突。不是推荐做这样的事
9.git checkout file 撤销文件的修改
他会先从暂存区找file,如果找不到,在当前仓库找,找到了就用来替换工作区的文件,git checkout commit file 直接将commit的file替换工作区
git 分支操作命令
1.git branch testing
创建但不切换分支
这会在当前所在的提交节点上创建分支
2.git checkout testing
切换分支
git checkout -b testing
创建并切换分支,这个比较混淆,算作特殊用法。
git checkout -b testing origin/testing
从远程取得一个分支并在本地创建
3.查看分支
git branch
查看本地
git branch -r
查看远程分支
git branch -a
查看所有分支
4.删除分支
git branch -d testing
git branch -D testing
强制删除
git branch -r -d
删除远程分支
5.git merge master
合并分支
开分支后,必然会做一些改动,且必然要合并到主分支上。如果当前是testing分支,git merge master就会将merge合并到testing,merge有可能会出现冲突,需要手动解决冲突,然后commit。拉取远程分支时git pull也会做一次合并。解决冲突的工具有很多,使用vscode编辑器足以,方法很简单,打开冲突文件即可
git 远程仓库操作命令
1.git clone url
克隆远程仓库
2.git remote
查看远程仓库服务器
通常origin 是默认的远程服务器
git remote -v
,查看远程服务器url地址
3.添加和移除远程服务器
git remote add <远程服务器> <url地址>
git remote remove <远程服务器>
4.拉取远程最新代码
git fetch origin testing
仅拉取
git pull origin testing
拉取并合并,如果已经有追踪分支,origin可以省略
git pull origin master --allow-unrelated-histories
拉取忽略不相关
5.跟踪分支,本地和远程分支的联系
git checkout -b testing origin/testing
或是git clone
创建的分支自带了与远程的联系
git branch -vv
可以查看所有分支关联的远程分支
git push -u origin master
, git branch -u origin/testing
手动设置与远程分支建立联系,建立关系后,git push就可以直接推送到远程
6.git push
推送
git push [remote-name] 分支名
,等价于下面
git push [remote-name] 本地分支名:远程分支名
如果远程没有该分支,会在远程自动创建,但必须建立与远程的联系
注意: 如果本地分支的最新进度<= 远程分支,则远程将拒绝你的push,必须先pull(也就是先merge远程),才能push
7.删除远程分支
git push origin --delete testing
git branch -r -d testing
为了正常与远程对接,一般操作流程如下:
1.克隆远程
git clone url
2.与远程远离联系
如果远程创建了分支,要切换到那个分支git checkout -b tt origin/tt
如果本地创建了分支,要推送到远程(远程没有这个分支),git push [remote-name] 本地分支名:远程分支名
,然后要绑定远程分支,git branch -u origin/分支名
3.对于http形式的远程url,最好做一下面密码操作
如果远程是https连接的,每次都需要输入密码,为了避免这样,可以克隆时手动改写一下url如,http://用户名:密码@远程仓库httpsurl
,当然你也可以改写remote地址达到同样效果:git remote set-url http://用户名:密码@远程仓库httpsurl
。
保持工作目录干净:
使用git reset --hard 并不能完全保证当前工作目录的干净,比如你从远程合并了master分支,出现了冲突,没提交直接reset到合并之前的commit,reset之后发现多出来了好多未跟踪的文件或文件夹,为什么会有多出来的文件,因为你在当前commit上,而你之前合并没提交,所以远程的commit并未成功写入本地,也就是说远程追踪的有些文件还没在本地追踪,你reset的时候,本地仓库只管你追踪的文件,多出来不管,如果要完全恢复到该commit的状态,git clean就行了,它将移除未追踪的文件,git clean -df可以把目录一起删了,所以git reset 通常和git clean连用。