-
git 修改用户名和邮箱
git clone速度慢,bash下执行如下命令,可走代理模式,亲试 可达1M/S
git config --global http.proxy socks5://127.0.0.1:1080
git config --global https.proxy socks5://127.0.0.1:1080
- git status:要随时掌握工作区的状态,使用git status命令。
- git diff:如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
- git log:在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看
- git log:命令显示从最近到最远的提交日志,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数
- git reflog:在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^ 回退到second commit
版本时,再想恢复到third commit,就必须找到third commit的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令
$ git reflog
8948d5d HEAD@{0}: reset: moving to 8948d5d3cf74480d175b56ac2fdb44b9cba1587a
7e6b459 HEAD@{1}: reset: moving to HEAD^
//注意HEAD^ 表示上一个版本
8948d5d HEAD@{2}: commit: Third commit
7e6b459 HEAD@{3}: commit: second commit
4215e65 HEAD@{4}: commit (initial): first commit
终于舒了口气,第三行显示third commit的commit id是8948d5d,现在,你又可以乘坐时光机回到未来了。
- 注意
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
在Git中,用HEAD表示当前版本,也就是最新的提交8948d...587a(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
Git不用输入用户名和密码
在每次使用git push的时候都需要输入用户和密码,是不是觉得很麻烦,为了提高效率
我们可以不需要输入密码就直接提交,我们知道Github获取远程库时,有ssh方式和https方式
两个方式的url地址不同,认证方式也不同。使用ssh时保存密钥对以后可以不再输入帐号密码,而https却不能。所以如果想要不再输入帐号密码,一种方式就是在git clone的时候使用ssh方式另一种方式就是改变remote远程url,如下:
$ git remote rm origin
$ git remote add origin [email protected]:houlucky/Days.git
创建版本库
1.git init 命令把这个目录变成Git可以管理的仓库
2.用命令git add告诉Git,把文件添加到暂存区
git add .
一次添加所有改动过的内容,注意后面有个点
$ git add readme.txt
//执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功
3.用git commit 告诉Git,把暂存区的所有内容提交到当前分支
$ git commit -m “本次提交的说明”
版本回退
- 版本的历史之间穿梭,使用
git reset --hard commit_id
- 查看提交历史,以便确定要退回哪一个版本
git log
该命令显示从最近到最远的提交日志,如果嫌输出信息太多,可以试试加上--pretty=oneline参数 - 查看命令历史,以便确定要回到未来的哪个版本
git reflog
管理修改
- 查看工作区与版本库里面最新版本的区别
git diff HEAD -- readme.txt
撤销修改
- 丢弃工作区的修改
git checkout -- readme.txt
- 不但改乱了工作区某个文件的内容,还添加到了暂存区,想丢弃更改
git reset HEAD readme.txt //回到场景1
git checkout -- readme.txt
- 如果已经提交到了版本库,可参考版本回退
删除文件
- 从版本库删除文件,使用
git rm readme.txt
删掉,并且git commit
- 把误删的文件恢复到最新的版本
$ git checkout -- readme.txt
//git checkout其实是用版本库里的版本替换工作区的版本,无论是工作区修改还
是删除都可以一键还原
添加远程库
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
;
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改;
克隆远程库
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
创建与合并分支
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph
命令可以看到分支合并图。
$ git log --graph --pretty=oneline --abbrev-commit```
###分支管理策略
通常,合并分支时,如果可能,Git会用**Fast forward**模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用**Fast forward**模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
![](http://upload-images.jianshu.io/upload_images/1715286-4567554d88499b68.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在实际开发中,我们应该按照几个基本原则进行分支管理:首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。所以,团队合作的分支看起来就像这样:
![](http://upload-images.jianshu.io/upload_images/1715286-c43fc57a0762ee12.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上**--no-ff**参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
$ git merge --no-ff -m "merge with no-ff" dev
###Bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
###feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
###多人协作
**推送分支:**
推送分支就是把该分支上的所有本地提交(commit)推送到远程库.推送时要指定本地分支,这样,Git就会把该分支推送到远程库对应的分支上:
$ git push origin master
如果要推送其他分支,比如dev,就改成:
$ git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
**多人协作的工作模式:**
1.首先,可以试图用```git push origin branch-name```推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地更新,需要先用```git pull```试图合并;
3.如果合并有冲突,则解决冲突,并在本地提交;
4.没有冲突或者解决掉冲突后,再用```git push origin branch-name```推送就能成功!
- 如果```git pull```提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令```git branch --set-upstream branch-name origin/branch-name```这就是多人协作的工作模式,一旦熟悉了,就非常简单。
- 在本地创建和远程分支对应的分支,使用```git checkout -b branch-name origin/branch-name```,本地和远程分支的名称最好一致。
###其他
- 随时掌握工作区的状态```git status```
- 查看修改的内容```git diff```
- 查看远程库的信息,用```git remote```
- 显示更详细的信息,用```git remote -v```
- ```git push```出错```fatal: Could not read from remote repository.Please make sure you have the correct access rights.and the repository exists```出现这个问题是因为,没有在github账号添加SSH key
**解决办法:**
在git bash输入:
ssh-keygen -t rsa -C "用户名"
然后一路回车,在```C:\Users\asus\.ssh```可以看见**id_rsa.pub**,把里面的内容复制粘贴到github上的**ssh key**就行了
**感谢**[史上最浅显易懂的Git教程!](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)