Git常用命令-程序员宅基地

技术标签: 面试  学习  github  Git  git  服务端  gitlab  

目录

一、概念理解

(一)工作区、暂存区、本地仓库、远程仓库

(二)远程分支、当前本地分支

(三)常用命令

1.git init

2.git clone

3.git pull、git fetch

4.git add

5.git commit

6.git reset

7.git branch

8.git status

9.git checkout

10.git push

11.git merge

12.git rebase

13.git revert

14.git log

15.git remote

15.git config 命令

16.git rm

17.git tag


一、概念理解

(一)工作区、暂存区、本地仓库、远程仓库

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:本地仓库
  • remote repository:远程仓库

https://github.com/liyinchigithub/Git-commandshttps://github.com/liyinchigithub/Git-commands

(二)远程分支、当前本地分支

(三)常用命令

1.git init

新项目执行Git初始化,并进行第一次提交

git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/liyinchigithub/Git-commands.git
git push origin master

2.git clone

对github、gitlab远程仓库,已有项目进行克隆

git clone https://github.com/liyinchigithub/Git-commands.git

3.git pull、git fetch

(1)将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。

git pull origin
git pull https://github.com/liyinchigithub/Git-commands.git

 远程分支是与当前分支合并

git pull origin master

(2)拉取代码,但不合并到本地

git fetch --all
git fetch --tags
git reset --hard origin/master

(3)git pull 与git fetch区别:

  • 远端跟踪分支不同

git fetch能够直接更改远端跟踪分支。

git pull无法直接对远程跟踪分支操作,我们必须先切回本地分支然后创建一个新的commit提交。

  • 拉取不同

git fetch会将数据拉取到本地仓库,它并不会自动合并或修改当前的工作

git pull是从远程获取最新版本并merge到本地,会自动合并或修改当前的工作

  • commitID不同

使用git fetch更新代码,本地的库中master的commitID不变,还是等于1。

使用git pull更新代码,本地的库中master的commitID发生改变,变成了2。

4.git add

(1)添加指定目录到暂存区,包括子目录:

git add [dir]

例如:添加2个文件到暂存区

git add README hello.js 

(2)添加当前目录下的所有文件到暂存区:

git add .

5.git commit

将暂存区内容添加到本地仓库中

git commit -m "提交内容备注"

在执行git add .  之后执行git commit

6.git reset

(1)回滚代码,撤销某一次commit,并强推到远程仓库

如果需要删除的 commit 是最新的,那么可以通过 git reset 命令将代码回滚到之前某次提交的状态,但一定要将现有的代码做好备份,否则回滚之后这些变动都会消失。具体操作如下:

git log // 查询要回滚的 commit_id

git reset --hard commit_id // HEAD 就会指向此次的提交记录

git push origin HEAD --force // 强制推送到远端

(2)回退所有内容到上一个版本

git reset HEAD^

(3)回退 hello.js 文件的版本到上一个版本

git reset HEAD^ hello.js

执行 git reset HEAD 命令用于取消已缓存的内容。

执行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存 。

(4)回退到指定版本

查看提交日志,回退到指定commit_id

git log
git reset --hard commit_id

 或者

git reset 052e

(5)回退上上上一个版本

git reset --soft HEAD~3

备注:此次提交之后的修改会被退回到暂存区

(6)回退到某个版本回退点之前的所有信息。

git reset –hard bae128

备注:此次提交之后的修改不做任何保留,git status 查看工作区是没有记录的。

(7)将本地的状态回退到和远程的一样

git reset --hard origin/master

注意谨慎使用 –hard 参数,它会删除回退点之前的所有信息

(8)HEAD 说明:

  • HEAD 表示当前版本

  • HEAD^ 上一个版本

  • HEAD^^ 上上一个版本

  • HEAD^^^ 上上上一个版本

  • 以此类推...

可以使用 ~数字表示

  • HEAD~0 表示当前版本

  • HEAD~1 上一个版本

  • HEAD^2 上上一个版本

  • HEAD^3 上上上一个版本

  • 以此类推...


(9)误删恢复

如果回滚代码之后发现复制错了 commit_id,或者误删了某次 commit 记录,也可以通过下方代码恢复:

git relog // 复制要恢复操作的前面的 hash 值

git reset --hard hash // 将 hash 换成要恢复的历史记录的 hash 值

注意:删除中间某次提交时最好不要用 git reset 回退远程库,因为之后其他人提交代码时用 git pull 也会把自己的本地仓库回退到之前的版本,容易出现差错进而增加不必要的工作量。

7.git branch

(1)新建分支

git branch 新建的分支名

 (2)查看所有分支信息

git branch

(3) 删除分支

git branch master
git branch -d 分支名称

删除分支前,需要切换到其他分支 

 ①删除本地分支

git branch
git checkout master
git branch -d 本地分支名

②删除远程分支

git push origin --delete 远程分支名称

如何本地分支已提交到远程仓库,想删除这个分支,除了删除本地分支,还需要远程分支也要删除,以上两个命令都要执行一次。

8.git status

查看当前分支状态

$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   README
    new file:   hello.php

9.git checkout

切换分支

10.git push

(1)将本地的 master 分支推送到 origin 主机的 master 分支。

git push origin master

(2)本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:

git push --force origin master

(3)指定分支

git push <远程主机名> <本地分支名>:<远程分支名>

 完整操作

git branch
git checkout 分支名
修改代码
git add .
git commit -m "提交内容注释"
git push origin master

远程项目仓库对提交上来的分支代码还有做merge操作,才可以把分支代码合并到master中

11.git merge

(1)开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支

git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master


(2)当master代码改动了,需要更新开发分支(dev)上的代码

git checkout master 
git pull 
git checkout dev
git merge master 
git push -u origin dev


 

12.git rebase

当两个分支不在一条线上,需要执行 merge 操作时使用该命令。

(1)撤销提交

如果中间的某次 commit 需要删除,可以通过 git rebase 命令实现,方法如下:

git log // 查找要删除的前一次提交的 commit_id

git rebase -i commit_id // 将 commit_id 替换成复制的值

进入 Vim 编辑模式,将要删除的 commit 前面的 `pick` 改成 `drop`

保存并退出 Vim

(2)解决冲突

该命令执行时极有可能出现 reabase 冲突,可以通过以下方法解决:

git diff // 查看冲突内容

// 手动解决冲突(冲突位置已在文件中标明)

git add <file> 或 git add -A // 添加

git rebase --continue // 继续 rebase

// 若还在 rebase 状态,则重复 2、3、4,直至 rebase 完成出现 applying 字样

git push

13.git revert

  • git revert:放弃某次提交。
    git revert 之前的提交仍会保留在 git log 中,而此次撤销会做为一次新的提交。
  • git revert -m:用于对 merge 节点的操作,-m 指定具体某个提交点。

(1)撤销提交

要撤销中间某次提交时,使用 git revert 也是一个很好的选择:

git log // 查找需要撤销的 commit_id

git revert commit_id  // 撤销这次提交

(2)撤销 merge 节点提交

如果这次提交是 merge 节点的话,则需要加上 -m 指令:

git revert commit_id -m 1 // 第一个提交点

// 手动解决冲突

git add -A

git commit -m ""

git revert commit_id -m 2 // 第二个提交点

// 重复 2,3,4

git push


14.git log

(1)查看提交历史

(2)用 --oneline 选项来查看历史记录的简洁的版本

git log --oneline

(3)可以用 --graph 选项,查看历史中什么时候出现了分支、合并。

 

 (4)可以用 --reverse 参数来逆向显示所有日志。

git log --reverse --oneline

 (5)如果只想查找指定用户的提交日志

git log --author

 例如,比方说我们要找 Git 源码中 liyinchi 提交的部分

git log --author=Linus --oneline -5

 (6)如果你要指定日期,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after。

git log --oneline --before={3.weeks.ago} --after={2020-04-23} --no-merges

 (7)git blame

git blame <file>

15.git remote

远程仓库操作

git remote show [remote]
git remote show https://github.com/liyinchigithub/Git-commands

(1)添加远程版本库

一般在新建项目时使用

git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/liyinchigithub/Git-commands.git
git push -u origin master

(2)删除远程仓库

git remote rm name

(3)修改仓库名

git remote rename old_name new_name 

15.git config 命令

(1)显示当前的 git 配置信息

git config --list
credential.helper=osxkeychain
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true

(2)编辑当前的 git 配置信息

git config -e

16.git rm

如果需要删除的 commit 是一个或多个文件,可以进行以下操作。

(1)被提交到仓库的某个文件需要删除,可以使用 git rm 命令:

git rm <file> // 从工作区和暂存区删除某个文件

git commit -m "" // 再次提交到仓库

(2)如果只想从暂存区删除文件,本地工作区不做出改变,可以:

git rm --cached <file>

(3)如果在工作区不小心删错了某个文件,可以用 git checkout 将暂存区的文件覆盖工作区的文件,从而把误删的文件恢复:

git checkout -- <file>

(4)用 git rm 删除文件,同时还会将这个删除操作记录下来;

用 rm 删除文件,删除的仅仅是本地物理文件,没有将其从 git 的记录中剔除。

(5)git add 和 git rm 区别,

git add 仅能记录添加、改动的动作,删除的动作需靠 git rm 来完成。

17.git tag

(1)打标签

到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签

git tag -a v1.0 -m "release 1.0 version"

git push origin :v1.0

或者,每次

git push origin tag v1.x

(2)查看本地标签

git tag

(3)查看远程 tag

git ls-remote --tags origin

(4)将本地tag推送到远程

git push origin v1.0

也可以仅执行该句,会自动生成本地tag并推送到远程


(5)完整打标签并推送到远程仓库

git add .

git commit -m "first commit"

git push origin master

git push origin v1.0

或者 

git add .

git commit -m "first commit"

git push origin master

git tag -a v1.1 -m "release 1.0 version"

git tag

git push origin :v1.1

(6)删除本地标签

git tag
git tag -d 标签名

(7)删除远程标签

git push origin :refs/tags/v1.0

(8)追加标签

如果我们忘了给某个提交打标签,又将它发布了,我们可以给它追加标签。

$ git tag -a v0.9 85fc7e7
$ git log --oneline --decorate --graph
*   d5e9fc2 (HEAD -> master) Merge branch 'change_site'
|\  
| * 7774248 (change_site) changed the runoob.php
* | c68142b 修改代码
|/  
* c1501a2 removed test.txt、add runoob.php
* 3e92c19 add test.txt
* 3b58100 (tag: v0.9) 第一次版本提交

常见问题

1.执行git push origin 提示”git hint: Please, commit your changes before merging“

解决办法:

简洁显示日志记录
 

git log --pretty=oneline 

git reset --hard 提交id

 

2.执行git pull 提示”error: You have not concluded your merge (MERGE_HEAD exists).
hint: Please, commit your changes before merging.
fatal: Exiting because of unfinished merge.“

 解决办法:

git reset --soft HEAD^

如果要要撤销第六次 commit 就要把 HEAD 指向 第五次 所以 reset 一下 HEAD 就好
注意:工作空间的代码的改动就没了
如果想保留工作空间的代码只是撤销commit,请执行下面的命令:
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013302168/article/details/124360566

智能推荐

【NAS、SAN和ISCSI】_nas iscsi-程序员宅基地

文章浏览阅读1.2k次。如果你的系统需要大量的磁盘容量,但是身边却没有外接存储设备,仅有个人计算机时,那该怎么办?此时,通过网络的SCSI磁盘(iSCSI)就能够提供帮助。这个iscsi是将来自网络的数据仿真成本机的SCSI设备,因此可以进行诸如LVM等方面的操作,而不是单纯使用服务器端提供的文件系统而已,相当有帮助。作为服务器的系统,通常是需要存储设备的,而存储设备出来可以使用系统内置的磁盘之外,如果内置的磁盘容量不够大,而且也没有额外的磁盘插槽可用时,那么常见的解决方案就是增加NAS:Network Attached St_nas iscsi

CMeet系列技术生态沙龙---城市开发者组织年度聚会·杭州 《把握未来趋势,持续学习创新》_cmeet沙龙-程序员宅基地

文章浏览阅读5.8k次,点赞34次,收藏29次。CSDN始终致力于促进城市区域内尖端新兴技术开发者交流,提供开放自由的切磋平台。在这个充满挑战和机遇的一年即将结束之际,通过本次聚会,汇聚杭州本地各行各业的开发者朋友,回顾过去一年城市社区的成就和收获,感谢携手同行的各位,更近期待新鲜血液的加入,共同展望明年新发展。_cmeet沙龙

html左边加右边减如何实现,前端大杂烩(1)-程序员宅基地

文章浏览阅读439次。在牛客网刷面经,不会的总结一下,当作备份Ajax和Flash各自优缺点:Ajax的优势:1.可搜索性 2.开放性 3.费用 4.易用性 5.易于开发。Flash的优势:1.多媒体处理 2.兼容性 3.矢量图形 4.客户端资源调度Ajax的劣势:1.它可能破坏浏览器的后退功能 2.使用动态页面更新使得用户难于将某个特定的状态保存到收藏夹中 ,不过这些都有相关方法解决。Flash的劣势:1.二进制..._前端有个左减右加的

Ant Design Vue,<a-tabel>进行纵向数据的动态合并_a-table如何设置纵向表头-程序员宅基地

文章浏览阅读1k次。写了一些方法让相同数据的行进行上下合并,可能不是最优解,仅提供一个解决思路,渣代码,望谅解最终效果:思路就是,传入数据源,表头,需要合并的项,然后计算这一行向下有多少个相同的数据就合并多少个单元格,并且被合并的单元格需要obj.attrs.rowSpan = 0因为需要合并的项是不确定的,我创建了一个对象obj[dataIndex]去记录一些需要用到的变量引入这个组件:传入的参数有三个 columns表头 dataSource数据源 customRenderList 需要合并的项,其中前两项和a_a-table如何设置纵向表头

Spring学习总结-程序员宅基地

文章浏览阅读175次。1. 关于IOC中的注入问题在上图中,我们在注入控制层的属性时,在使用xml文件注入时,bean标签有一个autowire属性,默认值是default,还有个两个值:byType和byName。byType:设置为此值时,spring容器会查找bean容器中有没有要注入的属性的类型的bean,找到唯一一个bean就将该bean注入给该属性,没找到或者找到多个bean,就会报错;byName:当我们设置为此值时,下面的property就可以省略不写,但是此时,spring容器会将要注入的属性作为bea

Unity3D - 怎么获取相机的屏幕截图-程序员宅基地

文章浏览阅读1.6w次。/// <summary> /// 获取相机的屏幕截图 /// </summary> /// <param name="camera"></param> /// <param name="width"></param> /// <param name="height"></param> /// <...

随便推点

为什么老工程师不值钱了-程序员宅基地

文章浏览阅读455次。前言-我的疑问我刚工作的时候,对资深老工程师羡慕佩服,一直期望自己能成为他们这样的人。我现在还没到35岁,但总听到媒体渲染35岁中年危机,似乎我钦佩的是一帮可怜虫。最近几年面试和共事的3..._高级工程师值不值钱

在线预览cad_cad 在线预览-程序员宅基地

文章浏览阅读1.7k次。官方node demo以下是自己手动改的 记录以下万一以后用到 async objects(msg){ // tiken client 获取 await setMsg(this.app) const token = await getInternalToken(); msg.oauth_token = token; msg.oauth_client = getClient(); // 读oss文件写到本地文件 let file = await t_cad 在线预览

写给准备进入IT行业的新人-程序员宅基地

文章浏览阅读93次。新人们常常会说我看了多少多少的书,看过某某人写的书,仿佛书看了就会做了。其实不然,很多新人在面试的时候夸夸其谈,说啥啥都知道一点,到真正做的时候,啥都不会。归根到底是没有经验,技术这玩意儿经验非常重要,很多东西如果不是你碰到了,你从书上一辈子都找不到答案。 我看书的习惯一般都是先把整个书翻翻,了解一下书的基本内容,然后在实际项目中遇到相应的问题再去翻书,当然这是..._matlab对进it行业有什么帮助

java_memcached-release_2.6.6.jar_java_memcached-release:pom:2.6.6-程序员宅基地

文章浏览阅读1.2k次。java_memcached-release_2.6.6.jar链接:https://pan.baidu.com/s/12kVG_8KvA5zybMsbQXkDlA提取码:zaji_java_memcached-release:pom:2.6.6

vue中使用treeselect上线后报错_menu.vue:56 warning: `value` should not be array w-程序员宅基地

文章浏览阅读574次。按照网上正常流程在单页面引用插件treeselect,本地运行正常,上线报错解决方案:不要单页面引用 放在main.js里引入import Treeselect from '@riophae/vue-treeselect'import '@riophae/vue-treeselect/dist/vue-treeselect.css'Vue.component('TreeSelect', Treeselect)vue.config.js文件里转化语法module.exports _menu.vue:56 warning: `value` should not be array when `treeselect` is single

第一个C++程序HelloWorld(Visual Studio 2017)_visual studio 第一次helloworld-程序员宅基地

文章浏览阅读1w次。在VS2017中新建一个C++项目:文件->新建->项目->Visual C++->Windows桌面->Windows控制台应用程序->名称和位置->确定。"stdafx.h"头文件全称“StandardApplication Framework Extensions”,指的是标准程序框架的扩展。以下摘自百度百科:预编译头文件通过编译stdafx.cpp生成,以工程名命名_visual studio 第一次helloworld

推荐文章

热门文章

相关标签