git下载与配置
sudo apt install git
github config --global user.name "你的github用户名"
github config --global user.email "你的github邮箱"
git工作流程
一般工作流程如下:
- clone Git 资源作为工作目录
- 在clone 的资源上添加和修改文件
- 如果其他人修改了,你可以更新资源
- 查看文件状态及修改情况
- 提交和推送
- 在修改完成后,如果发现错误,可以撤回提交
Git 工作区、缓存区和版本库
-
工作区(Working Directory)
电脑中能看到的目录
-
版本库(Repository):.git文件夹
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
-
缓存区:.git目录下的index文件
当对工作区修改的文件执行"git add "命令时,暂存区的目录树被更新
Git创建并更新仓库
1. 新建并进入文件夹
2. 初始化
git init #将当前目录作为git仓库
注意,初始化后会出现一个.git的文件夹,所有git所需要的数据和资源都放在这个目录中
3. 将文件添加到git仓库
git add *** #可以是文件、文件夹或者.
git commit -m "文件内容标注"
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到缓存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
简单理解为,需要提交的文件修改通通放到缓存区,然后,一次性提交缓存区的所有修改。
git add . # 将当前目录下所有文件和文件夹中的更改全部添加到暂存区,包括新建和删除的文件
git commit -am "xxxx" # 将所有修改的文件添加到缓存区并提交到仓库,注意不受控制的新建文件是不会被提交的
Git 基本操作
- clone别人的仓库
git clone [url]
- 随时掌握工作区的状态
git status
- 回退之前版本
- 只是修改了文件,没有任何 git 操作
git checkout -- xxxx # 还原特定文件
git checkout -- * # 还原所有文件
- 修改了文件,并提交到暂存区
git reset HEAD # 所有文件回退到当前版本
git reset HEAD file # file回退到当前版本
- 修改了文件,并提交到仓库区
git reset --hard HEAD^ #返回上一个版本, HEAD是指向当前分支版本的指针
git reset --hard HEAD^^ #返回上上一个版本
git reset --hard HEAD~100 #返回往上100个版本
- 删除文件(且自动add到缓存区)
git rm file #删除工作区及仓库的文件
git rm --cached file #删除仓库文件,保留工作区文件
Git 远程仓库
1. 添加远程仓库
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库
在Repository name填入仓库名(和本地保持一致),其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
在本地的learngit
仓库下运行命令:
git remote add origin https://github.com/你的github用户名/github仓库名.git
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
第一次推送master分支的所有内容
git push -u origin master
将会关联到远程的master 分支上,以后就可以git push不指定参数了
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程
推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
Git支持多种协议,包括
https
,但通过ssh
支持的原生git
协议速度最快。使用
https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令
分支管理
创建分支
增加一个分支指针dev,HEAD指向dev,工作区的文件都没有任何变化!
git branch dev # 创建
git checkout dev 切换
git checkout -b dev # -b表示创建并切换
合并分支
合并特定分支到当前分支
git merge dev
删除分支
删掉dev指针
git branch -d dev
.gitignore
-
每行代表一个忽略规则
-
以斜杠“/”开头表示目录;
以星号“*”通配多个字符;
以问号“?”通配单个字符
以方括号“[]”包含单个字符的匹配列表;
以叹号“!”表示不忽略(跟踪)匹配到的文件或目录; -
一定要养成在项目开始就创建.gitignore文件的习惯,否则一旦push,处理起来会非常麻烦
git配置别名
git config --global alias.st status
–global参数是全局参数,表示这些命令在这台电脑的所有Git仓库下都有用,如果不加,那只针对当前的仓库起作用,通常全局配置文件是主文件夹下的.gitconfig
git打标签
便于恢复到特定版本
git tag v1.0 #打标签,默认标签是打在最新提交的commit上的
git tag #查看标签
git tag -a <tagname> -m "blablabla..." #可以指定标签信息
git tag -d v0.1 #删除本地标签
git push origin <tagname> #可以推送一个本地标签
git出现冲突
当两个分支都进行了修改,且要merge合并时,会发生冲突,此时需要针对冲突文件,手动修改冲突的地方,再add、commit后,两个分支会自动合并
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
多人协作
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用git push origin 推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。