本文永久跟新地址:https://my.oschina.net/bysu/blog/1918635
【若要到岸,请摇船:开源中国 不最醉不龟归】
之前对git爱答不理,最近需要用到,真的有点高攀不起感觉...好了,闲话少说,言归正传。
最近摸索着用,整理了一下,有些地方理解不对,还请指正,但请勿拍砖。
有必要的说明就,如下:
1.项目公共仓库(下称:远程仓库);
2.把项目从公共仓库中fork到自己的仓库(下称:个人仓库);
3.从公共仓库把项目clone到本地,并通过git init设置本地git版本管理库(下称:本地版本库)。
以下为本人使用流程。
1.本人从公共仓库把项目fork到个人仓库,然后再通过个人仓库clone到本地,并通过git init设置该目录,进行git版本管理,如下图:
2.一般工作的话,都是从主分支中新建一个分支,在新的分支中工作,譬如创建一个新的分支dev。如下图:
a.在完成1,2步骤之后,这时(步骤3)有其他人对远程仓库中的文件A1进行了更改,远程仓库中的A1文件(A1-1,图中标错了,标成文件1-1了)此时里面的内容跟本地仓库中的A1不一样了,此时本地的文件A1还是跟之前的一样,未改变。
b.在本地仓库发生了这些变化,(步骤4)创建了一个dev分支,并在该分支上对本地仓库中的A1进行编辑(A1-2).
3.经过以上步骤,这时如果需要把本地经过编辑的内容(A1-2)同步到远程仓库,应该怎么做比较好呢?
a.进行下面之前先要进行本地仓库跟远程仓库进行关联,本地仓库跟个人仓库进行关联,完成这两步之后,先在本地master分支把远程仓库中的内容pull下来(步骤5),保证其他人最新的修改,你这边都拿到(为的就是怕到时候你把你的内容push到远仓时,把其他人你上次到这次之间提交的内容覆盖掉),此时本地master和远仓中A1文件,其都为A1-1。
b.把本地仓库dev分支合入本地master分支中(步骤6)。因为此刻本地仓库的dev分支中A1文件为A1-2,这时需要解决A1-1和A1-2之间的冲突,才能把dev分支合入master分支中。此时,本地仓库中的A1文件为A1-3.
c.把本地仓中的内容push到个人仓库中(步骤7),此时个人仓库中的A1文件状态为A1-3.
d.最后把个人仓库中的代码合入远程公共仓库,此时远程公共仓库中文件A1状态为A1-3.
整个过程就是这样子,只要所有人都按照这个流程,都可以保证最终的内容都互相同步。不知不觉又快0点30分了(更新时间:2018年8月3日 00:23:49)。洗洗睡了。
下面附上git对比工具的设置与使用
windows下设置 beyond compare 4 为 git 的对比工具。
首先需要先安装 beyond compare 4 工具,切记需要安装安装版的,不要搞绿色版的。下面BCompare.exe为你自己的实际安装路径。
#difftool 配置
git config --global diff.tool bc4
git config --global difftool.prompt false
git config --global difftool.bc4.cmd '"D:\Application\BeyondCompare 4\BCompare.exe" "$LOCAL" "$REMOTE"'
#mergeftool 配置
git config --global merge.tool bc4
git config --global mergetool.prompt false
git config --global mergetool.bc4.cmd '"D:\Application\BeyondCompare 4\BCompare.exe" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"'
git config --global mergetool.bc4.trustexitcode true
#让git mergetool不再生成备份文件(*.orig)
git config --global mergetool.keepBackup false
--------------------------------------------------------------------------------------------------------------------
安装git客户端后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
正真使用之前,可以自己搭建一个git服务器,如果只是学习git,没必要这么麻烦。到https://github.com/注册一个自己的账号即可,即可免费获得Git远程仓库。
如果需要从远程库clone东西下来,
由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可。
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
第2步:打开https://github.com/settings/keys,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容。保存后,就可以clone东西到你的本地了。
----------------------------------------------------------------------------------------------------------------------------------
下面是用到的一些命令。
1.创建本地空白版本库mygit
git init
2.往本地仓库添加文件testFile.txt(该文件需放在上面仓库所在的目录)
vi testFile.txt
往里面随便增加几行文字
abcd
ef
ghijk
3.告诉git,你增加了一个文件
git add testFile.txt #可多次使用,可一次提交多个文件
4.告诉git,你提交了什么,以便后来者知道情况。
git commit -m "提交内容的说明"
5.修改文件testFile.txt
vi testFile.txt
#把内容改为,如下:
haha
6.可以通过git status命令查看哪些文件被修改了
git status
7.在git add 文件之前,可以通过git diff命令查看上一次的内容是什么
git diff testFile.txt
注:如果已经git add文件才想通过git diff查看上一次的内容是什么,怎么办呢?(据说可以直接通过这个命令git diff --cached)执行以下命令即可
git reset HEAD testFile.txt
8.修改文件的提交跟新增文件的提交一样。
9.查看目前版本之前的提交历史记录
git log
#或者用下面的命令
git log --pretty=oneline
10.回退历史版本
git reset --hard HEAD^
Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交xxxx...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
11.如果发现回退错了,想回到最新版本,上面的命令HEAD^修改成最新版本的id即可,可通过以下命令查看历史id
git reflog
12.撤销尚未提交到暂存区的修改
git checkout -- fileName
13.撤销已提交到暂存区(git add)的修改
命令git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区,然后重复步骤12即可
14.删除版本库里面的文件
先删除本地,然后通过git rm
删掉,并且git commit,删除版本库。
15.误删本地,从版本库恢复
git checkout -- fileName
16.关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改;
17.创建分支
首先,我们创建dev
分支,然后切换到dev
分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch
命令查看当前分支:
$ git branch
* dev
master
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
现在,我们把dev
分支的工作成果合并到master
分支上:
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev
分支的最新提交是完全一样的。
注意到上面的Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward
,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
Deleted branch dev (was b17d20e).
删除后,查看branch
,就只剩下master
分支了:
$ git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master
分支上工作效果是一样的,但过程更安全。
摘自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000