几个概念
Workspace:工作区
- 在电脑上能看到的目录,隐藏目录.git除外。
Index / Stage:暂存区
Repository:仓库区(或本地仓库,版本库)
- .git文件属于版本库
- 暂存区在此库中
- Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。
Remote:远程仓库
- 远程库的默认名称是origin
分支:时间线
本地仓库操作(本电脑)
注册信息
$ git config --global user.name "aic1999"
$ git config --global user.email "你的邮箱@qq.com"
进入项目路径(注意是/不是\)
cd 项目路径
把项目添加进git版本库
- 所有的版本控制系统,只能跟踪文本文件的改动
git init
- 看见路径下多了一个.git文件不要动他,说明项目已经进入版本控制状态了。
创建一个文件readme.txt
可以手动创建,也可以用touch命令创建
touch readme.txt
添加文件到暂存区
git add readme.txt
将暂存区的文件提交到当前分支
git commit -m "这里面是我们想打的注释内容"
查看暂存区还有谁未提交/被修改未提交
- 可以通过命令git status来查看是否还有文件未提交。如果文件被修改了,那么执行"git status"后,显示出的红色名字文件就是已被修改但未提交的文件。
git status
查看修改的内容
查看文件可以用cat命令
git diff readme.txt
- 重新执行add和commit操作即可上传修改后的文件。
查看修改的历史记录
- 可以查看版本号(用于撤销回退操作)、时间、修改者、注释。
git log
- 推荐使用下面的命令,简洁、直观
git log --pretty=oneline
版本回退
- 回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推。
git reset --hard HEAD^
- 如果要回退到前100个版本的话,使用:
git reset --hard HEAD~100
撤销版本回退
- 此时git log是找不到已经被回退的版本号的。已被回退的版本号可以通过"git reflog"命令可以获得。
git reflog
git reset --hard 版本号
撤销修改/撤销删除
- 假如又修改了一次文件,多添加了一行字怎么撤回?三个方法如下。
- 手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit到版本区的分支上。
- 使用 git reset --hard HEAD^ 直接回退到上一个版本。
- 使用撤销命令,把文件在工作区做的修改全部撤销,如下命令。
- 修改后,如果还没有放到暂存区,使用checkout语句 撤销修改就回到和版本库一模一样的状态。
- 另外一种是文件已经放入暂存区了,接着又作了修改,checkout撤销修改操作就会回到添加暂存区后的状态。
git checkout -- readme.txt
- 删除文件操作是"rm 文件"
- 注意:如果执行了commit命令,那就不能用上述语句撤销删除操作了。
远程仓库操作(连接github)
- 注册github账号 由于你的本地Git仓库和github仓库之间的传输是通过SSH加密的,要创建ssh
- 创建ssh key(有就跳过)
ssh-keygen -t rsa –C "邮箱"
- 在路径/c/Users/59977/.ssh下可以看到生成的密钥。
- 把密匙之一的ssh-rsa.pub的内容添加进github中
- 在github的setting中可以找到ssh key,然后添加即可。
- 本机关联github
git remote add origin https://github.com/用户名/项目名.git
- 把本地库的内容推送到远程
由于远程库是空的,我们第一次推送master分支时,加上了 –u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push -u origin master
注意,如果本地目录下没有README.md文件,执行推送会报错。此时执行git pull --rebase origin master即可,会发现github上的项目被克隆下来了,再执行推送就可以了。
- 这时即可在github上看到本地的项目
- 从现在起,只要本地作了提交,就可以通过如下命令,把本地master分支的最新修改推送到github上了。
git push origin master
从github下载
git clone "网址"
分支
- master主分支应该是非常稳定的,也就是用来发布新版本。
- 一般情况下不允许在master上面干活,干活一般情况下在新建的dev分支上干活。
- 干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。
- master才是指向提交的,HEAD指向的是当前分支。可以把分支理解成时间线。你在a分支上修改了文件内容,如果切换到b分支则看不到在a分支上修改了啥。
创建分支
git branch 分支名
- git checkout 命令加上 –b参数表示创建并切换,相当于如下2条命令 git branch dev、git checkout dev
git checkout -b 自定义分支名
- 代表创建并切换到该分支
选择当前分支
git checkout 分支名
查看分支
git branch
删除分支
git branch -d 分支名
合并分支
- 合并指定分支到当前分支上。如果合并的是ab分支,那么,在a分支做的修改,在b分支上也能看到。
git merge 指定分支名
- 默认情况下,合并是“快进模式”(Fast-forward),也就是直接把master指向dev的当前提交,所以合并速度非常快。
- 但这种模式有个缺点,删除分支后,会丢掉分支信息。可以用“git merge -–no-ff -m “注释” 分支名” 语句禁用。
如果分支a修改了文件,分支b也修改了文件,这时候合并分支就会产生冲突(conflict fixed)。这时候要修改文件,让它和其中一个分支的文件一样才行。
bug分支
- 每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。
- 在开发中接到一个404 bug时候,我们可以创建一个404分支来修复它,但是,当前的dev分支上的bug2还没修复、还没有提交,因此我们还无法提交404分支上的bug,怎么办?Git还提供了一个stash功能,可以把当前工作现场(即dev分支上的bug2) ”隐藏起来”,等以后恢复现场后继续工作。如下,然后再git status查看工作区状态,就发现dev被隐藏起来了。
git stash
查看工作现场列表
git stash list
恢复工作现场
- 恢复后,stash内容并不删除,还需要使用命令git stash drop来删除。
git stash apply
- 恢复的同时把stash内容也删除了。
git stash pop
远程库(多人协作时)
查看远程库
git remote
推送分支
- 把该分支上所有本地提交到远程库中,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上。
git push origin 当前分支名(一般是master)
- 如果同伴修改了文件并推送上去,我也修改了同一个文件并且推送上去,就会推送失败。
- 因为我的小伙伴最新提交的和我试图推送的有冲突,解决的办法也很简单,上面已经提示我们,先用git pull把最新的提交从origin/分支名抓下来,然后在本地合并,解决冲突,再推送。(如果本地合并也冲突,参照之前写的方法)
git pull