Git学习笔记

举报
山海之光 发表于 2020/12/21 11:10:43 2020/12/21
【摘要】 1、仓库初始化仓库又名版本库,英文名repository,两种方法进行初始化:(1)创建一个空目录D:\workspace\git\learngit,在该目录下使用git init,将增加一个.git目录,learngit目录就成了一个git本地仓库;(2)大多数情况下,git clone GitHub上的一个代码库时,就同时完成了下载和仓库初始化,比如:git clone https://...

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仓库的管理功能,如addcommitpushpull

 

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,该命令表示撤销addstage,还需要再使用git checkout -- readme.txt

 

4、查看仓库状态

1git status,查看文件发生了怎样的变化;

2git diff filename,查看上图master分支中和工作区中指定文件的区别,不带filename则列出所有的区别(不建议使用该命令,有很长的输出);

3git log,查看仓库中的所有版本,会显示版本号和版本说明;

4git reflog show --date=iso,查看每次的版本变动记录,包括commitresetpullcheckout等,并且有日期信息

 

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可以查看到本地分支有masterdev,使用git checkout branch_name可在本地分支之前切换,使用git branch -d dev可删除本地分支

3)演进本地开发分支:在dev分支下,修改代码,git addgit commit,使dev分支向前演进;

4)推送到远程分支:git push <远程主机名> <本地分支名>:<远程分支名>,注意这个远程分支名千万不要是master分支,应该是一个临时新建的分支,因为git push不会提示push内容,有可能push了错误的代码进去;

如:git push origin duqi-dev:dev

 

7git常用命令汇总

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 addgit commit

2git 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进行比较,最后删除冲突标记;

5git add -ugit rebase --continue,如果还有冲突,则继续解决冲突,如果没有冲突,则完成代码的更新

使用git rebase --abort可以回到rebase之前的状态

方法二(一般不推荐,仅做参考)

1)将自己本地的所有修改进行git addgit commit

2git pull <远程主机名> <远程分支名>:<本地分支名>,取回某个远程主机的某个分支的更新,直接合并到本地分支,git pull相当于git fetchgit merge;(首次git pull发生冲突会提示冲突的文件,冲突未解决再次git pull,会直接rejected。如果冲突未解决,切换和删除分支都会被rejected

如:git pull origin multiengine-dbs-dws:multiengine-dbs-dws-duqi-20170927

3)如果有合并冲突,使用git staus查看哪些文件发生了冲突,手动修改所有冲突;

4git add所有修改好的冲突文件,git commit,完成代码的更新。

 

参考资料:

http://blog.csdn.net/wh_19910525/article/details/7554489

http://blog.csdn.net/chenansic/article/details/44122107 merge的部分讲的不太对,但是rebase部分讲得不错

 

9、远程仓库与本地仓库协同

Gitfork 源仓库、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分支

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。