Git学习笔记
1、仓库初始化
仓库又名版本库,英文名repository,两种方法进行初始化:
(1)创建一个空目录D:\workspace\git\learngit,在该目录下使用git init,将增加一个.git目录,learngit目录就成了一个git本地仓库;
(2)大多数情况下,git clone GitHub上的一个代码库时,就同时完成了下载和仓库初始化,比如:git clone https://github.com/cocodataset/cocoapi.git,会将远程的git仓库clone到本地。
.git目录提供git仓库的管理功能,如add、commit、push、pull等
2、添加修改到仓库
有三种修改:增加、删除、修改一个文件
(1)增加,在windows目录中新建readme.txt,然后git add readme.txt;
(2)删除,在windows目录中删除readme.txt,然后git rm readme.txt;
(3)修改,在windows目录中修改readme.txt,然后git add readme.txt;
增加、删除、修改,这三种操作都涉及工作区和版本库的概念,如下图所示:
在windows中能看到的目录和文件都是属于工作区,被隐藏的.git目录是版本库,版本库中又分暂存区(stage)和分支(图中为master)
每次在工作区增删改文件后,都需要git add到暂存区,多次修改需多次add,最后一次性用git commit -m "xxxx",将修改提交到分支
commit之后就变成了下图,暂存区为空:
3、撤销工作区的修改
误修改和误删除文件都可以被撤销,分两种情况:
(1)只是在工作区修改,未add到暂存区:git checkout -- readme.txt;
(2)工作区已修改,且已add到暂存区:git reset HEAD readme.txt,该命令表示撤销add到stage,还需要再使用git checkout -- readme.txt
4、查看仓库状态
(1)git status,查看文件发生了怎样的变化;
(2)git diff filename,查看上图master分支中和工作区中指定文件的区别,不带filename则列出所有的区别(不建议使用该命令,有很长的输出);
(3)git log,查看仓库中的所有版本,会显示版本号和版本说明;
(4)git reflog show --date=iso,查看每次的版本变动记录,包括commit、reset、pull、checkout等,并且有日期信息
5、版本回退
git reset --hard HEAD^,需要版本回退就用这个命令,但是要慎用,最好在自己独立开发的分支上用,不要在公共分支上使用这条命令,撤销前一次 commit,就仿佛这个commit重来没提交过一样,git log中看不到这个commit记录,但是还可以用git reflog查看。
6、分支开发
git中鼓励大量使用分支来进行开发,多分支的向前演进相互不影响,一般来说master是主分支,其他分支开发完成之后可以合并到master分支,分支开发的步骤如下:
(1)初始化仓库:git clone https://github.com/cocodataset/cocoapi.git,将远程git仓库clone到本地,将在本地默认创建master分支;
(2)创建本地开发分支:git checkout -b dev 远程主机名/远程分支名,从远程分支创建一个本地分支dev,并切换到本地分支,使用git branch可以查看到本地分支有master和dev,使用git checkout branch_name可在本地分支之前切换,使用git branch -d dev可删除本地分支
(3)演进本地开发分支:在dev分支下,修改代码,git add,git commit,使dev分支向前演进;
(4)推送到远程分支:git push <远程主机名> <本地分支名>:<远程分支名>,注意这个远程分支名千万不要是master分支,应该是一个临时新建的分支,因为git push不会提示push内容,有可能push了错误的代码进去;
如:git push origin duqi-dev:dev
7、git常用命令汇总
(1)同步:
git pull <远程主机名> <远程分支名>:<本地分支名>,取回某个远程主机的某个分支的更新,直接合并到本地分支,如果没有冲突,则直接合并,如果有冲突,解决办法请查看下一节。
如git pull origin master:master
(2)推送:
git push <远程主机名> <本地分支名>:<远程分支名>
如git push origin master:master
(3)分支管理
git branch,查看本地分支
git branch -a,查看本地和远程的所有分支
git branch -d branch_name,删除本地分支
git checkout branch_name,切换本地分支
git checkout -b 本地分支名 远程主机名/远程分支名,从远程分支创建一个本地分支
(4)撤销文件修改
git checkout file_name,撤销某未commit的文件的修改
git checkout .,撤销所有文件的修改
8、从远程获取更新到本地,发生冲突的解决办法
有两种方法,方法一(推荐):
(1)将自己本地的所有修改进行git add,git commit;
(2)git fetch <远程主机名> <远程分支名>,将远程主机的某个分支的更新全部取回本地,但是并没有合并到本地分支;
如:git fetch origin multiengine-dbs-dws
(3)所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取,格式为git rebase <远程主机名>/<远程分支名>,如git rebase origin/multiengine-dbs-dws,如果没有冲突,则直接完成代码的更新,分支的变化如下图所示:
(4)如果有冲突,使用git status,最下方会显示“both modified:”,表示有冲突的文件,直接用文本编辑器打开冲突的文件,冲突标记<<<<<<< HEAD和=======之间表示远程分支的内容,=======和>>>>>>> [id号]之间表示本地分支的内容,手动解决冲突,如果冲突内容比较复杂,使用beyond compare进行比较,最后删除冲突标记;
(5)git add -u,git rebase --continue,如果还有冲突,则继续解决冲突,如果没有冲突,则完成代码的更新
使用git rebase --abort可以回到rebase之前的状态
方法二(一般不推荐,仅做参考):
(1)将自己本地的所有修改进行git add,git commit;
(2)git pull <远程主机名> <远程分支名>:<本地分支名>,取回某个远程主机的某个分支的更新,直接合并到本地分支,git pull相当于git fetch加git merge;(首次git pull发生冲突会提示冲突的文件,冲突未解决再次git pull,会直接rejected。如果冲突未解决,切换和删除分支都会被rejected)
如:git pull origin multiengine-dbs-dws:multiengine-dbs-dws-duqi-20170927
(3)如果有合并冲突,使用git staus查看哪些文件发生了冲突,手动修改所有冲突;
(4)git add所有修改好的冲突文件,git commit,完成代码的更新。
参考资料:
http://blog.csdn.net/wh_19910525/article/details/7554489
http://blog.csdn.net/chenansic/article/details/44122107 merge的部分讲的不太对,但是rebase部分讲得不错
9、远程仓库与本地仓库协同
Git:fork 源仓库、fork 仓库副本和 local 仓库的同步,参考 http://www.jianshu.com/p/29775d91f536 ,http://blog.csdn.net/zwhlxl/article/details/45110587 ,http://blog.csdn.net/spy19881201/article/details/38873283, 其实就是将源仓库的变动变成一次本地的代码修改,再push到自己的仓库副本,以这种方式实现同步。注意,源仓库的变动合到自己本地仓库的分支时可能会有冲突,有冲突则要手动解决。不管是fork源仓库还是fork仓库副本,对本地仓库来说都是远程仓库,git并不能自动识别哪个是源仓库,哪个是仓库副本,需要程序员自己去记住
git clone到本地后,默认是master分支
- 点赞
- 收藏
- 关注作者
评论(0)