Git学习札记

首先理解几个基本概念:

origin:默认远程版本库;

master:默认开发分支;

(1)git log

查看提交日志。会显示出你的每一次提交。如图:

(2)git log --pretty=oneline

如果你觉得上面输出内容太多太杂,可以使用这个命令。信息会在一行显示。如图:

(3)git branch

查看当前分支。如图,我现在在master分支。

(4)git reflog

查看提交历史,以便确定你要回滚到哪个版本。根据前面的hash值或者HEAD可以进行回滚。

(5)git diff 文件名

查看你某个文件的修改前后对比。红色“-”为删除,绿色“+”为插入。修改过程就是先删除,后插入。

(6)git reset --hard 7位哈希值

回滚到某个版本。7位哈希值可以通过git reflog查到。如图:


(7)cat 文件名

查看某个文件的内容。如图:

(8)git checkout -- 文件名

把该文件在工作区的修改全部撤销,这里有两种情况:

一种是文件修改后还没有放到暂存区(也就是还没有执行git add),现在撤销修改就回到和版本库一样的状态;

一种是文件修改后已经添加到暂存区(已经执行了git add),又做了修改,撤销修改就回到了添加到暂存区后的状态;

总之,就是让这个文件回到最近执行git commit或git add时的状态。

注意中间的"--"很重要,没有“--”,就变成了“切换到另一个分支”的命令。

.

(9)git reset HEAD 文件名

把暂存区的修改撤销掉(unstage),重新放回工作区。

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区,当我们用HEAD时,表示最新的版本。

(10)git rm 文件名

在工作区中增加一个文件,并添加到本地分支中。但是如果你不需要这个文件了。你直接用"rm 文件名"删除该文件。这个时候,Git知道你删除了文件,因此,工作区和版本库就不一样了。git status可以查看当前的情况。

此时有两个选择:

1.确实要从版本库中删除该文件,就用命令"git rm 文件名"删掉,并且git commit提交,此时该文件就真正从版本库中删除了。

2.另一种情况是删错了,因为版本库中还有该文件,所以可以把误删的文件恢复到最新版本,“git checkout -- 文件名”。“git checkout”就是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

.

(11)git remote add origin ***github仓库地址

关联一个远程仓库。在第一次提交之前进行。

(12)git remote -v

查看远程仓库的地址。

(13)git remote rm origin

删除原来的远程仓库地址。

(14)git push -u origin master

第一次推送master分支的所有内容。

(15)git push origin master

以后每次的修改使用该命令。

(16)关于分支:

在版本回滚里,每次提交,Git都把他们串成一条时间线,这条时间线就是一个分支。到目前为止,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD指针严格来说不是指向提交,而是指向master,master才是指向提交的。所以,HEAD指向的就是当前分支。

git checkout -b dev

创建一个dev分支,然后切换到dev分支。

.

(17)上述命令相当于以下两条命令:

git branch dev  :新建一个dev分支;

git checkout dev   :切换到dev分支;

(18)git branch

查看本地所有分支。前面带星号*的表示当前所在的分支。

注意:

git branch -a:查看所有分支,包括本地分支和远程分支。

本地分支用绿色和黑色显示,绿色表示你现在所在分支,黑色是其他分支。远程分支用红色表示。

git branch -r  :查看远程所有分支,都以红色显示。

git branch -d dev:删除本地某一个分支,如dev分支。

(20)合并分支

1. git checkout -b dev :首先创建一个dev分支,并切换到dev分支;

2.进行修改文件,然后提交。

.

3.cat main.m

dev分支下

发现里面我增加了“//dev分支”这几个字;

4.git checkout master:现在dev分支的工作完成了,我们就可以切换到master分支。

.

5.cat main

master分支下。

发现里面并没有“//dev分支”,因为那个提交是在dev分支上,而maser分支此刻的提交点并没有变。

。.

6. git merge dev

把dev分支的工作成果合并到master分支上。

git merge 命令用于合并指定分支到当前分支。合并后,在查看文件内容,就可以看到,和dev分支的最新提交是完全一样的。

7.上面的"Fast-forward"信息,Git告诉我们,这次的合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

8.git branch -d dev

合并完成后,就可以放心的删除dev分支了。

.

9.分支小结:因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果使一样的,但过程更安全。

(21)解决冲突

1.git checkout -b testConflict

git add .

git commit -m "testConflict提交,测试冲突"

新建一个testConflict分支,用来测试冲突。并修改其中的一行代码;提交。

.

2. git checkout master

git add .

git commit -m "测试"

在master分支下,同样修改同一行代码,并进行提交;

.

3.git merge testConflict

此时两个分支各自有了新的提交,此时,Git无法执行“快速合并”,只能视图把各自的修改合并起来,但这种合并就会有冲突。此时合并的结果如下:

.

4.git 提示我们有冲突。可以通过"git status"命令来查看哪个文件有冲突。如图:

5. 我们可以直接去冲突文件查看,可以看到如下代码:

其中<<<<<,=====,>>>>>>,这种地方表示是有冲突的。可以手动进行修改,修改后代码如下:

然后在master下进行提交即可。如图:

6.git log --graph

可以看到分支的合并情况,如图:

注意上面:"Merge: 5da331c 1225c73",  是把后面的分支合并到前面的分支。也就是把testConfict分支合并到master分支上。这个7位数是commit后面那串数字的前7位。

commit 后面那串数字是hash值,使用的是SHA-1哈希算法,40位的长度。是根据你的文件内容计算出的hash值。

7.git log --graph --pretty=oneline

可以让输出在一行显示,如图:

.

8. 最后把testConflict分支删除即可。注意:当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

(22)分支管理策略

1.通常合并分支时,如果可以,Git会使用Fast Forward快进模式,但这种模式下,删除分支后,会丢掉分支信息。我们可以使用--no-ff方式的git merge.

2.git checkout -b dev

仍然创建并切换到dev分支。

3.git add .

git commit -m "merge --no-ff"

在dev分支下进行提交。

4.git checkout master

切换到master分支下。

5.git merge --no-ff -m "merge with no-ff" dev

合并使用--no-ff参数,表示禁用Fast Forward。因为本次合并要创建一个新的commit,所以加上-m参数。

6.git log --graph --pretty=oneline --abbrev-commit

查看分支历史。注意使用--abbrev-commit 参数可以把commit的40为hash值缩短为7位,方便查看。

7.分支策略:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master上发布1.0版本。每个人都有自己的分支,时不时往dev分支上合并就可以了。

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出曾经做过合并。而fast forward合并就看不出曾经做过合并。默认是“fast forward”.

(23)Bug分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

1.git stash

把当前的工作现场储藏起来,等以后回复现场后继续使用。

git stash list

查看当前分支中存储的stash

2.git status

此时在dev分支中查看工作区,是干净的。因此可以放心的创建分支来修复bug。

3.git checkout master

git checkout -b issue-101

首先确定要在哪个分支上修复bug,假定要在master分支上修复,就从master创建临时分支。

4.在issue-101上修复bug,提交。

5.git checkout master

git merge --no-ff -m "修复完成,合并issue-101分支" issue-101

git log --graph --pretty=oneline --abbrev-commit

合并bug分支。

6.git branch -d issue-101

删除bug分支。

7.git checkout dev

git status

再次回到dev分支干活,工作现场是完全干净的。

8.git stash list

查看当前的工作现场。Git把stash内容存储在某个地方了。我们需要恢复现场。

.

9.git stash pop

git stash list

在恢复内容的同时把stash的内容也删了。

.

10.git stash apply

git stash drop

这两行命令相当于“git stash pop”. 用“git stash apply”恢复,但是恢复后,stash内容并不删除,需要用“git stash drop”来删除。

11.git add .

git commit -m "在dev分支提交"

把dev分支工作的内容提交。等下要合并到master分支。

12.git checkout master

git merge --no-ff -m "合并dev分支的工作内容" dev

如果有冲突,则手动修改。

13.git add .

git commit -m “合并了dev后的master提交”

git branch -d dev

手动解决冲突后,在master提交,然后删除dev分支。

14.小结:修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。

当手头工作没有完成时,先把工作现场git stash 一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

(24)Feature分支

1.添加一个新功能,你肯定不希望因为一些实验性质的代码,把主分支搞乱了。所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后删除feature分支。

当开发完成后,如果在还没有合并之前,这个新功能不需要了。就需要删除该分支。

git branch -d feature-net

.

2.git branch -D feature-net

注意:1中的删除无法成功,因为该分支还没有被合并,如果删除,将丢失修改。如果要进行强行删除,要使用"git branch -D feature-net"命令。

3.小结:开发一个新的feature,最好新建一个分支。如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

(25)git remote

查看远程库的信息。

git remote -v

显示详细信息。显示了可以抓取和推送的origin地址。如果没有推送的权限,就看不到push的地址。

(26)多人协作

1.推送分支:就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上。

git push origin master

如果要推送到其他分支,比如dev,就改成:

git push origin dev

但是并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些分支不需要呢?

--master分支是主分支,因此要时刻与远程同步;

--dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

--bug分支只用于在本地修复bug,没必要推送到远程;

--feature分支可以看实际开发需要。

2.抓取分支

git checkout -b dev origin/dev

创建远程origin的dev分支到本地。

git branch --set-upstream dev origin/dev

设置本地dev与远程origin/dev分支的链接。

3.多人协作的模式:

--首先,可以试图用git push origin branch-name推送自己的修改;

--如果推送失败,因为远程分支比你的本地分支版本新,需要先用git pull视图合并;

--如果合并有冲突,则解决冲突,并在本地提交;

--没有冲突或者解决冲突后,再用git push origin branch-name推送就能成功。

--如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令"git branch --set-upstream branch-name origin/branch-name".

4.小结

--查看远程库信息,使用“git remote -v”;

--本地新建的分支如果不推送到远程,对其他人就是不可见的;

--从本地推送分支,使用“git push origin branch-name”,如果推送失败,先用"git pull"抓取远程的新提交;

--在本地库创建和远程分支对应的分支,使用“git checkout -b branch-name origin/branch-name”,本地和远程分支的名称最好一致;

--建立本地分支和远程分支的关联,“git branch --set-upstream branch-name origin/branch-name”;

--从远程抓取分支,使用git pull.如果有冲突,要先处理冲突。

(27)标签管理

发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Gitde 标签虽然是版本库的快照,但其实他就是指向某个commit的指针。所以,创建和删除标签都是瞬间完成的。

(28)创建标签

git tag v1.0

切换到要打标签的分支上,执行“git tag v1.0”,默认是打在最新提交的commit上。

git tag

查看所有的标签。

.

git tag v1.1 commit_id

标签可以打在任意一个提交上。

git show v1.0

查看标签信息。

.

(29)操作标签

1.git tag -d v1.0

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

2.git push origin v1.0

推送某个tag到远程分支。

3.git push origin --tags

一次性推送全部尚未推送到远程的本地标签。

4.如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除

git tag -d v1.0

然后从远程删除。删除命令也是push,但是格式如下:

git push origin :refs/tags/v1.0

.

5.小结:

--命令“git push origin <tagname>”:可以推送一个本地标签;

--命令“git push origin --tags”:可以推送全部未推送的本地标签;

--命令"git tag -d <tagname>":可以删除一个本地标签;

--命令“git push origin :refs/tags/<tagname>”:可以删除一个远程标签。

时间: 2024-10-12 11:12:04

Git学习札记的相关文章

git 学习小记之记住https方式推送密码

昨天刚刚学了点git基础操作,但是不幸的是[email protected]给出公告说尽量使用 https 进行操作.可是在用 https 进行 push 时,都需要输入帐号和密码. 各种百度谷歌之后在[email protected]官网找到了解决方法<https方式使用[email protected]设置密码的方式>文中给出了几个方法,并且都非常简单. 关于 cache 缓存方式,我不太喜欢,因为要设置时间,而且会过期.而 store 相应的非常方便,设置全局后,方便多个库使用.当然如果

Git 学习笔记

Git 学习笔记 本文整理参考廖雪峰的 Git 教程, 整理 Git 学习笔记, 用于 Git 常用命令速查:常用命令用彩色标注! Git学习笔记 $ git config --global user.name "Your Name" 配置本机所有仓库的用户名 $ git config --global user.email "[email protected]" 配置本机所有仓库的Email地址 $ git init 初始化一个Git仓库 $ ls -ah 查看隐

Git学习 -- 自定义Git

忽略特殊文件 在工作区创建.gitignore文件,编写内容 # Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: 忽略Python编译产生的.pyc..pyo.dist等文件或目录 *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa 然后add和commit该文件 此后当工作区出现.gitignore中类型文件时,git

git学习小结

背景:最近因为工作原因,需要将以前的代码库由bitbucket重新布置在一台服务器上,所以就学习了下git,特此记录下 在167这台机器上搭建apache,用做git server,由于以前apache都已经搭好了,所以这里只配置git server 就可以了,此处贴出配置: 服务器搭好了,来到配置中的root目录,git clone https://[email protected]/XXXX 此时,库和服务器都搭好了,用于新库测试的机器也可以从git server上克隆库了,来,我们来试试从

Git学习笔记(二)

本次学习的是 版本回退 基本命令: 查看提交历史      git log 版本回退            git reset 查看每一次的命令 git reflog 具体步骤: 添加一句话到readme.txt中,并提交到Git库中. . readme.txt在Git中目前有三个版本: 按提交时间先后顺序排列如下: 第一个:wrote a readme.txt 第二个:add distrubuted 第三个:add difficulties 如果版本过多的话,根本记不住,只能查看使用命令git

Git 学习笔记&lt;简介与安装&gt; (一)

Git,开源中国以及GitHub所使用的系统, Is A 一个分布式版本控制系统 Be Used to 为团队合作写代码提供方便的管理系统.几乎满足你所有关于合作写代码的幻想. Has 本地端:工作区.版本库 (版本库还含有一个暂存区) 远程仓库:版本库(用来储存版本库的服务器) How To Install Linux: 首先,先输入git,看看是否安装Git: $ gitThe program 'git' is currently not installed. You can install

Git学习笔记总结和注意事项

一.Git简介 Git是目前世界上最先进的分布式版本控制系统,其特点简单来说就是:高端大气上档次! 二.Windows上Git安装 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Windows这几大平台上正常运行了. msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可.安装完成后,在开

Git学习 -- 标签管理

新建标签 git tag <tagname>   默认为HEAD,也可以指定一个commit id eg.   git tag v0.9  git tag v1.0 31aa59c git tag <tagname> -m "xxx"   可以指定标签信息 git tag -s <tagname>             可以用PGP签名标签 查看标签 git tag     查看所有标签 git show <tagname>    参看

git(学习之三)基本操作

Git学习笔记 ##################################################### qq:1218761836 qq群:150181442 E-mail:[email protected] ##################################################### 目录 Git. 2 1.1 初次运行前的配置... 2 1.2 创建版本库... 3 0.3 git提交文件... 4 1.4 检查当前文件状态... 4 1.5