使用前的一些设置
git --version 查看版本信息
git config --global user.email 邮箱 配置邮箱
git config --list 查看配置结果
git config --global core.autocrlf false 让git不要管windows/unix换行符转换的问题
git config --global core.ignorecase false windows上还需配置
git ssh key pair配置
1.ssh-keygen -t rsa -C 邮箱
2.ssh-add ~/.ssh/id_rsa 如果出现could not open a connection...的错误先执行eval `ssh-agent`,再执行ssh-add ~/.ssh/rsa成功ssh-add –l就有新加的rsa了
3. cat ~/.ssh/id_rsa.pub 查看公钥,没有pub后缀的是私钥(生成秘钥的位置看git窗口)
git的三个阶段:
- working tree:就是你所工作在的目录,每当你在代码中进行了修改,working tree的状态就改变了。
- index file:是索引文件,它是连接working tree和commit的桥梁,每当我们使用git-add命令来登记后,index file的内容就改变了,此时index file就和working tree同步了。
- commit:只有commit了,我们的代码才真正进入了git仓库。 我们使用git-commit就是将index file里的内容提交到commit中。
git add 文件名 把文件修改添加到暂存区
git commit -m "注释内容" 把暂存区的所有内容提交到当前分支-ma 将add和commit两步合并为一步
git log --pretty=oneline 显示日志,但是内容较少
git reflog 记录每一条命令,以便确定回到未来那个版本
git log 查看提交历史,以便回退到那个版本
git log --graph 分支合并图
git diff 查看文本区别
git diff: 是查看working tree(工作区)与index file(暂存区)的差别的。
git diff --cached: 是查看index file与commit的差别的。
git diff HEAD: 是查看working tree和commit的差别的。(HEAD代表的是最近的一次commit的信息)
git diff -w 消除 No newline at end of file提示,每一个文件最后一句一回车换行结束
git rm file 删除文件
git checkout -- readme.txt 撤销工作区的修改(其实就是用版本库的版本替代工作区的版本,无论是修改还是删除)
(1)readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
(2)readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
总之,就是让这个文件回到最近一次git commit或git add时的状态
git reset HEAD 文件名 将提交到暂存区的修改撤回到工作区,然后再用git checkout指令丢弃工作区的更改
提交到远程仓库
git remote add origin url 连接远程仓库(origin是默认远程仓库名)
git push -u origin master 提交到远程仓库的master分支(-u 关联本地的分支和远程的分支,下次只要输入git push就行)
第一次提交要加-f参数,远程库中没有此版本,需要强制提交
git remote -v 查看远程连接
从远程仓库克隆
git clone url 克隆远程仓库的项目到本地, 所有本地分支默认与远程主机的同名分支,建立追踪关系
git checkout -b dev 创建dev分支并切换
-b参数表示创建并切换 ,该命令相当于两条命令git branch dev和git checkout dev
git branch 查看当前分支(当前分支前会有一个*号)
git checkout 分支名 切换分支
git merge 分支名 合并某分支到当前分支(默认使用fast forward模式,但是合并后会丢掉分支信息)
--no-ff 关闭forward模式,以普通模式合并(普通模式合并后的历史有分支,能看出来做过合并)
git branch -d 分支名 删除某分支(合并过的)
git branch -D 分支名 删除某分支(没有合并过的,该分支的所有修改就地销毁)
切换到dev分支下修改并commit,修改是保存在dev分支下,切换回master分支后,dev下提交的修改并不会生效,一旦切换到dev
分支下,才会出现修改内容
一般情况下,是在分支完成某个任务,完成后用merge命令与master合并,然后在删除分支
git stash list 查看工作现场列表
git stash apply 恢复工作现场,但是恢复后,stash内容并不删除,需要 用git stash stop来删除
git stash apply stash@{0} 指定列表中项
gti stash pop 恢复的同时删除stash的内容
git branch -r 查看远程分支
git checkout –b v1.0 origin/master 生成新的分支v1.0,远程也会有v1.0分支
git push origin HEAD –u 将分支推送到远程的同名分支(HEAD指向本地最新的提交版本)
git push origin v1.0 –u origin是远程主机名
git push <远程主机名> <本地分支名>:<远程分支名> 将本地分支的更新推送到远程主机
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b <branch-name> origin/<branch-name>,本地和远程分支的名称最好一致;
建立当前分支和远程分支的追踪关系,使用 git branch --set-upstream-to=origin/远程分支名 本地分支名 (本地分支要先切换到需要连接的分支) 也可以考虑 git branch -u origin/远程分支名
git branch -vv 本地分支与远程分支的映射关系
git branch --unset-upstream 撤销本地分支与远程分支的映射关系
多人协作的工作模式通常是这样:
首先,可以试图用
git push origin <branch-name>
推送自己的修改;如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并;如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to=origin/<branch-name> <branch-name>
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
$ git push <远程主机名> <本地分支名>:<远程分支名>
$ git pull <远程主机名> <远程分支名>:<本地分支名>
将远程存储库中的更改合并到当前分支中。在默认模式下,git pull
是git fetch
后跟git merge FETCH_HEAD
的缩写,使用--rebase
,它运行git rebase
而不是git merge
。
例:git pull origin next (省略了:后的本地分支名)
上面命令表示,取回origin/next
分支,再与当前分支合并。实质上,这等同于先做git fetch
,再执行git merge
。
$ git fetch origin
$ git merge origin/next
git fetch和git pull的区别
- git fetch:相当于是从远程获取最新版本到本地,不会自动合并。
$ git fetch origin master
$ git log -p master..origin/master
$ git merge origin/master
以上命令的含义:
- 首先从远程的
origin
的master
主分支下载最新的版本到origin/master
分支上 - 然后比较本地的
master
分支和origin/master
分支的差别 - 最后进行合并
上述过程其实可以用以下更清晰的方式来进行:
$ git fetch origin master:tmp
$ git diff tmp
$ git merge tmp
在实际使用中,
git fetch
更安全一些,因为在
merge
前,我们可以查看更新情况,然后再决定是否合并。