git入门、常用命令理解和项目中git实战

项目开发中git是非常重要的,它可以有效、高速地处理从很小到非常大的项目版本管理。

资料:

项目开发常用命令

可以设置当前仓库的 用户和邮箱

git config --local user.name 'xxx';

git config --local user.email 'xxx';

设置全局的仓库大的用户名和邮箱

git config --global user.name 'xxx'; 

git config --global user.email 'xxx';

在github提交代码后贡献如果没有被记录,有可能就是你全局或者当前的git仓库的用户名和邮箱不是github的用户名和邮箱。

如果这个命名存在也可以直接覆盖修改,还可以替换git config中已有的邮箱

$  git config --global --replace-all user.email "输入你的邮箱"
$  git config --global --replace-all user.name "输入你的用户名"

保存密码: 如果没有设置ssh 可以通过保存密码的方式来跳过输入密码这个步骤

git config credential.helper store
  • git stash: https://www.cnblogs.com/zndxall/archive/2018/09/04/9586088.html

  • 本地主分支 : origin/HEAD -> origin/master 表示默认分支

  • 查看提交详细信息: git show

  • git status :命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。git status不显示已经commit到项目历史中去的信息。 一般红色的没有被追踪到,绿色的是已经add后的, 意思就是被追踪了

  • 克隆指定分支下的内容: clone -b brandName url

  • 参看所有分支: git branch -a 会列出当前库所有的分支(本地、远程)

  • 切换分支: git checkout branchName 加上 -b 参数会新建并切换到该分支 git checkout -b branchName

  • 创建分支:git brahch branchName

  • 删除分支:git branch --delete branchName

  • 删除远程分支: git push --delete origin branchName

  • 删除那些远程仓库不存在的分支: git remote prune origin

  • 查看本地分支与远程分支的对应关系: git remote show origin

  • 重命名git本地分支:
    git branch -m old_local_branch_name new_local_branch_name

  • 重命名git远程分支:是先删除远程的分支,然后更改本地分支名,然后将更改后的分支推送到远程

通过这个命令可以看出 本地分支与远程分支的对应关系,是否与远程有对应关系。
Local branches configured for 'git pull':表示本地分支 从哪个远程分支拉取
Local branches configured for 'git pull':表示本地分支 推送到哪个远程分支上去

git 常用命令理解

git fetch

将某个远程主机的更新 git fetch <远程主机名> 若要更新所有分支,命令可以简写为: git fetch

上面命令将某个远程主机的更新,全部取回本地。默认情况下,git fetch取回所有分支的更新。如果只想取回特定分支的更新,可以指定分支名,如下所示: git fetch <远程主机名> <分支名>

比如,取回origin主机的master分支: git fetch origin master

所取回的更新,在本地主机上要用远程主机名/分支名的形式读取。比如origin主机的master分支,就可以用origin/master读取。

git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。

$ git branch -r
origin/master

$ git branch -a
* master
  remotes/origin/master

上面命令表示,本地主机的当前分支是master,远程分支是origin/master。取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。

git cherry-pick

场景: 如果你的程序已经发布了一个版本0.1.1, 代码分支叫release-0.1.1, 现在正在开发0.1.x, 我们在开发分支进行后续的开发,那么有一天产品说, 要把正在开发的某个特性(功能)提前上线, 也就是说要把开发分支上的某些更改移到release-0.1.1的版本上, 那么怎么办呢?。

思考: 我们的目标是:需要把这个需要发的功能相关的代码移植到想relesase-0.1.1分支上面,这里有一种比较非体力的方法,就是把要发布的内容挑出来,然后移到新的分支(基于relesase-0.1.1拉出来的分支)上去,然后把新的分支合并到relesase-0.1.1。(不能把开发分支直接合并到relesase-0.1.1)

推荐解决方式: 使用git cherry-pick cherry-pick会重演某些commit, 即把某些commit的更改重新执行一遍。或者简单理解这里有10次commit提交的内容,你可以任意挑选出其中5次commit的内容,然后重新执行这5次提交(这就是重演)。

  1. 基于release-2.0分支新建分支release-2.1, 并且到新创建的分支上
    git checkout -b release-2.1 release-2.0
  2. 将dev-3.0分支上的某些commit在release-2.1分支上重演
git cherry-pick dev-3.0分支的某些commit-hash
如:
git cherry-pick  
20c2f506d789bb9f041050dc2c1e954fa3fb6910 
2633961a16b0dda7b767b9264662223a2874dfa9 
5d5929eafd1b03fd4e7b6aa15a6c571fbcb3ceb4  

多个commit-hash使用空格分割, commit-hash最好按提交时间先后排列, 即最先提交的commit放在前面.

cherry-pick不仅可以用在不同分支之间, 还可以用在同一个分支上.
不同分支的用法如上所述. 同一分支用法也是一样的, 同一分支使用情形:
比如说你在某一个向某个分支中添加了一个功能, 后来处于某种原因把它给删除了,
然而后来某一天你又要添加上这个功能了, 这时候就可以使用cherry-pick把添加那个功能的commit, 再重演一遍.

常见分支操作 -新建分支

情况1 :

如果远程新建了一个分支,本地没有该分支,可以用 git checkout --track origin/branch_name

这时候本地会新建一个分支名叫branch_name,会自动跟踪(track)远程的同名分支branch_name(就可以在这个本地分支上推拉代码)

用上面中方法,得到的分支名永远和远程的分支名一样,如果想新建一个本地分支不同名字,同时跟踪一个远程分支可以利用。
git checkout -b new_branch_name branch_name

这条指令本来是根据一个branch_name分支分出一个本地分支new_branch_name,但是如果所根据的分支branch_name是一个远程分支名,那么本地的分支会自动的track远程分支。

注意:一般用git push --set-upstream origin branch_name来在远程创建一个与本地branch_name同名的分支并跟踪;利用git checkout --track origin/branch_name来在本地创建一个与branch_name同名分支跟踪远程分支.

当使用git checkout -b new_branch_name origin/branch_name当提交的时候会报这个错:

fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:master

To push to the branch of the same name on the remote, use

    git push origin dev-test

这是由于Gitpush.default的设置的原因

Gitpush.default可以指定在没有明确指定远程分支的情况下,默认push的远程分支,其取值可以是:

  • nothing - push 操作无效,除非显式指定远程分支(意思就是 push的时候 必须指定远程的分支)

  • current - push 当前分支到远程同名分支,如果远程同名分支不存在则自动创建同名分支(central 和 non-central workflows都适用)

  • upstream - push 当前分支到它的upstream分支上(通常用于central workflow

  • simple - simpleupstream是相似的(通常用于central workflow),只有一点不同,simple必须保证本地分支和它的远程upstream分支同名,否则会拒绝push操作

  • matching - push所有本地和远程两端都存在的同名分支

  • central / non-central workflowsGit的两种常见工作流场景:

    1. central workflows - 集中式工作流,一个分支的pushpull都是同一个远程仓库
    2. non-central workflows - 非集中式工作流,一个分支的pushpull可能分别都有不同的远程仓库

在Git 2.0之前,push.default的内建值被设为'matching',2.0之后则被更改为了'simple'。

通过git remote show origin可以看到每个分支的具体信息: (例如 git checkout -b local origin/daily/dev)

 Local branches configured for 'git pull':
     local merges with remote /daily/dev
     master       merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

由于git checkout -b local origin/daily/dev会自动创建远程分支/daily/dev 和本地分支local的跟踪关系。
其中Local branches configured for 'git pull':下的就是upstream跟踪分支。

可以看出,远程分支/daily/dev和本地分支local建立了git pull的关系,但是没有建立git push的关系。此时如果强行push,不会成功,会出现如下提示:

fatal: The current branch new has no upstream branch.  
To push the current branch and set the remote as upstream, use
    git push --set-upstream origin develop

这种提示的处理方式下面会给出具体的处理方法。

情况2 :

本地新建分支,然后推送到远程,可以使用git branch branch_name或者git checkout -b branch_name(新建并切换到该分支) 新建一个本地分支,然后修改了代码 执行add 、commit、最后执行push操作 发现会发现报错:

# git push 
fatal: The current branch make-scripts-executable has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin branch_name

这是因为Git不知道你要提交到哪个分支上去, 所以需要你指定提交的分支, 直接从本地检出的新分支,第一次push,远程仓库还没有与之建立tracing关系的分支,所以需要设置upstream,这个设置一次之后,后面再push的时候就不用设置了。

如果不想这样写则需要指定提交到远程的分支: git push origin branch_name

git push origin branch_name推向制定的分支,最强暴的方法。但是每次提交都要指定,太麻烦了(而且还容易出错)。所以需要与远程分支关联。

所以使用git push --set-upstream origin branch_name远程分支关联。 这样就不用每次push的时候都指定分支了,都会提交到关联的远程分支上去。(branch_name是远程分支名)

常见分支操作 合并分支

git merge命令用于将两个或两个以上的开发历史加入(合并)一起。 将 merge 后面的分支合并到当前分支。

  • 将分支dev合并到当前分支中,自动进行新的提交:
git merge dev
  • 合并分支 branch1 和 branch2 在当前分支的顶部,使它们合并:
git merge branch1 branch2
  • 合并branch1分支到当前分支,使用ours合并策略:
git merge -s ours branch1
  • 将分支branch1合并到当前分支中,但不要自动进行新的提交:
git merge --no-commit branch1

Git checkout [文件名]、git reset HEAD [文件名] 、git reset [哈希值] 的应用场景。

git reset HEAD [文件名]
gitAdd.png

通过git reset [文件名] 可以将暂存区的文件放出来 , 但是我们的工作区的内容没有改变。只是相当于 对[文件名] 不执行 git add 操作 。 类似于后退操作。

git checkout [文件名]

工作区回退:如果比对后,发现这次改动不是我们想要的,那么我们可以回退到未修改之前,(在vsCode等编辑器里面,可以放弃修改)

git checkout readme.txt
git checkout .
git checkout -- readme.txt  // 以防判断成分支
gitChange.png

下面这串数字是我们新加的, 通过git status 我们可以看到readme.md文件做了修改

gitChange1.png

使用 git checkout [文件名] 可以将它变成修改前的是 ,意思就是放弃本次修改。 执行改命令后,发现添加的数字不见了
git status 显示文件没有修改。

gitChange2.png

如果我们已经添加到了暂存区(意思已经执行 git add 操作了),如果要退回到修改前,我们应该怎么处理呢。

直接通过git checkout [文件名]是不能将它回退到未修改的样子的。可以先采用git reset HEAD [文件名] 将它移除暂存区(意思就是回退在没有执行git add 的时候), 然后通过git checkout [文件名] 将改文件退回到修改前。

git reset [哈希值]

上面的操作都是在暂存区 ,还没有使用git commit 提交到本地厂库 。如果已经提交到本地厂库了又要如何操作呢。

将readme.md文件添加一段文字, 然后提交到本地的厂库。

gitChange3.png

通过git reflog可以看到一共有两个版本 当前的版本是HEAD -> master

gitReflog.png

然后 在修改文件readme.md,然后在提交到本地厂库。

gitChange4.png

但是这个时候的需求是 回到没有添加第二次提交文字的时候,意思就是要回到上一个版本。

可以通过使用 git reset 的命令来完成。基本的流程是执行:git reset --mixed HEAD^意思就是回退到上一个版本。

gitReset1.png

可以发现命令成功了,是不是页面也变成了原来的样子呢,然后并没有改变。那这个命令具体做了什么呢?

我们通过看readme.mdgit status看可以看到

gitChange5.png

gitChange6.png

是将它回退没有执行git add命令之前了,相当于你修改了代码 但是没有提交的那个状态。然后可以通过git checkout readme.md 命令将它变回未修改的状态。

但是如果我们要从现在没有添加那个文字的这个版本 变到添加了文字的版本 要如何操作呢。

通过git reflog 可以看出当前的版本是fd8258e

gitReset2.png

我们使用 git reset --hard HEAD^, 发现这里readme.md文件直接被修改了。

gitReset3.png

同时版本并灭有从fd8258e 变到 a5da32e 而是变到了df0abb9,这里的原因是git的提交是一条时间线,在这条时间线上,fd82582的上一次提交就是df0abb9

gitReset4.png

如果要变成指定的版本应该采用命令: git reset [哈希值]; --mixed 为默认参数

gitReset5.png

显示readme.md被修改了,通过左右两边的比较可以发现。 左边相当于原文件,而右边相当于对原文件的修改。可以通过 git checkout readme.md放弃本次修改。

githash.png

执行git checkout readme.md页面变成了修改之前的,同时也可以使用git statsu看出没有做出修改。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 开始: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/...
    草根老张阅读 841评论 0 50
  • 查看、添加、提交、删除、找回,重置修改文件 git help # 显示command的help git sho...
    Swiftor阅读 2,103评论 0 2
  • 本文针对初级用户,从最简单的讲起,但是需要读者对Git的基本用法有所了解。 Git是开源的分布式版本控制系统,...
    Sachie阅读 1,142评论 0 2
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,804评论 0 8
  • 三大区域: 工作区 → 缓存区 → 本地仓库 一 、 使用 git config 命令进行配置: git ...
    Manchangdx阅读 2,841评论 0 2