当前位置: 首页 > news >正文

git

git 基本操作

一、克隆

1、HTTP

git clone http://github.com/username/projectname.git

用于项目无写入需求

2、HTTP Secure

git clone https://username:password@github.com/username/projectname.git

用于小项目,写入需求

3、Secure Shell

git clone git://github.com/username/projectname.git
git clone git@github.com:username/projectname.git

安全性最高,日常码字推荐

二、配置

1、个人信息

git config --global user.name "youname"
git config --global user.email "address@example.com"

PC 建议加上 --global 参数,这样你就不用每次都需要设置个人信息了。全局配置文件位置在 ~/.gitconfig,另外该文件也可以设置快捷别名,在 [alias] 下添加快捷别名即可。

2、克隆不全

如果,发现自己需要克隆所有子模块。要怎么操作呢?

$ git clone --recursive git://github.com/username/projectname.git

如果已经克隆好了:

$ git submodule update --init --recursive

从远程拉取(fetch) 所有分支:

(master)$ git fetch --all

三、提交

1、信息错误

如果你的提交信息(commit message)写错了且这次提交(commit)还没有推(push), 你可以通过下面的方法来修改提交信息(commit message):

$ git commit --amend

这会打开你的默认编辑器, 在这里你可以编辑信息. 另一方面, 你也可以用一条命令一次完成:

$ git commit --amend -m 'xxxxxxx'

如果你已经推(push)了这次提交(commit), 你可以修改这次提交(commit)然后强推(force push), 但是不推荐这么做。

2、作者错误

我提交(commit)里的用户名和邮箱不对,且单个提交(commit),你可以通过下面的方法来修改它:


$ git commit --amend --author "New Authorname <authoremail@mydomain.com>"

如果提交的多个 commit 皆错误,你需要按照以下指令进行操作:

$ git log
commit a42798ac329222f5c32922c329222f554028102c6
Author: root <root@example.me>
Date:   Tue Oct 24 16:10:23 2017 +0000

    The Content In HERE.
$ git rebase --interactive ${commit_info_in_the_gitlog}

这将重设置你的仓库。注意需要将作者信息出现错误的头部从 pick 改为 edit

$ git commit --amend --reset-author

进行批量修改作者名称。

$ git rebase --continue
$ git push -f  

强制覆盖推到远端。

3、丢弃信息

我想从一个提交(commit)里移除一个文件

通过下面的方法,从一个提交(commit)里移除一个文件:

$ git checkout HEAD^ myfile
$ git add -A
$ git commit --amend

这将非常有用,当你有一个开放的补丁(open patch),你往上面提交了一个不必要的文件,你需要强推(force push)去更新这个远程补丁。

我想删除我的的最后一次提交(commit)

如果你需要删除推了的提交(pushed commits),你可以使用下面的方法。可是,这会不可逆的改变你的历史,也会搞乱那些已经从该仓库拉取(pulled)了的人的历史。简而言之,如果你不是很确定,千万不要这么做。

$ git reset HEAD^ --hard
$ git push -f [remote] [branch]

我想扔掉本地的提交(commit),以便我的分支与远程的保持一致

先确认你没有推(push)你的内容到远程。

git status 会显示你领先(ahead)源(origin)多少个提交:

(my-branch)$ git status

# On branch my-branch
# Your branch is ahead of 'origin/my-branch' by 2 commits.
#   (use "git push" to publish your local commits)

一种方法是:

(master)$ git reset --hard origin/my-branch

4、找回信息

如果你意外的做了 git reset --hard, 你通常能找回你的提交(commit), 因为Git对每件事都会有日志,且都会保存几天。

(master)$ git reflog

你将会看到一个你过去提交(commit)的列表, 和一个重置的提交。 选择你想要回到的提交(commit)的SHA,再重置一次:

(master)$ git reset --hard SHA1234

这样就完成了。

四、分支

1、建立分支

在master下创建一个新分支,不切换到新分支,仍在master下:

(master)$ git branch my-branch

或者创建一个新的分支并进入:

(master)$ git checkout -b 21
(21)$

2、删除分支

删除本地

(master)$ git branch -D my-branch
Deleted branch my-branch (was 4e3cd85).

删除一个远程分支:

(master)$ git push origin --delete my-branch

你也可以:

(master)$ git push origin :my-branch

3、恢复分支

在这时候你应该想起了reflog, 一个升级版的日志,它存储了仓库(repo)里面所有动作的历史。

(master)$ git reflog
69204cd HEAD@{0}: checkout: moving from my-branch to master
4e3cd85 HEAD@{1}: commit: foo.txt added
69204cd HEAD@{2}: checkout: moving from master to my-branch

正如你所见,我们有一个来自删除分支的提交hash(commit hash),接下来看看是否能恢复删除了的分支。

(master)$ git checkout -b my-branch-help
Switched to a new branch 'my-branch-help'

(my-branch-help)$ git reset --hard 4e3cd85
HEAD is now at 4e3cd85 foo.txt added

(my-branch-help)$ ls
README.md foo.txt

看! 我们把删除的文件找回来了。 Git的 reflog 在rebasing出错的时候也是同样有用的。

备注

Q1:为什么每个 projectname 后面都有 .git 标志,这是一种后缀名吗?

A1:Linux 下是没有后缀名概念的。事实上通过一些设置 Web 端也可以没有后缀名概念,但对于 Github 来说该后缀名区分了是 projectissueswiki 或是其他。你也可以换成 git clone git@github.com:username/projectname.wiki 试试唷。

Q2:第一个和第二个克隆方式似乎很相似,能再多说一点吗?

A2:是的,本质上都是使用了 Web 端的特性和 Github 关系不大。HTTP 是万维网的数据通信的基础,HTTPS 由网景公司在 1994 年首次提出,随后扩展到互联网上。HTTPS 经由 HTTP 进行通信,但利用SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。http://username:password@example.com/ 在标准 HTTP "Authorization" 标头中发送认证信息。

Q3:我使用了 Secure Shell 方式并没有克隆成功为什么呢。

A3:"日常码字" 意味着拥有项目的写入权限。所以设置上也会相对麻烦些,首先要在本机生成 SSH Key,其次复制 .pub 公钥文件至 Github。相关操作步骤网上有很多就不写出来了,你可以自己研究研究。对了,使用 ssh -T git@github.com -i ~/.ssh/id_rsa 可以知道公钥是否成功被 Github 接受使用。

转载于:https://www.cnblogs.com/itxdm/p/git.html

相关文章:

  • Mysql数据库的条件查询语句
  • 观《时间的朋友2017》总结
  • Angry Birds和广告系统泄露个人信息——FireEye对Angry Birds的分析
  • Vagrant (二) - 日常操作
  • 2017年终总结、随想
  • js
  • PHP multipart/form-data 远程DOS漏洞
  • java 内存分析 jmap
  • 功能架构图、信息结构图、产品结构图的区别和绘制方法
  • 我们雇佣了一只大猴子...
  • 关于Android P 开发者预览版首发
  • Flink1.7.2 local WordCount源码分析
  • PyQt5 -day3-3 格栅布局 又叫 网格布局
  • 云服务器绑定主机名的正确姿势
  • 第十八天-企业应用架构模式-基本模式
  • canvas 绘制双线技巧
  • ES2017异步函数现已正式可用
  • java8 Stream Pipelines 浅析
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • LeetCode算法系列_0891_子序列宽度之和
  • Nacos系列:Nacos的Java SDK使用
  • Netty 4.1 源代码学习:线程模型
  • REST架构的思考
  • Vue2.0 实现互斥
  • vue-loader 源码解析系列之 selector
  • 构造函数(constructor)与原型链(prototype)关系
  • 机器学习中为什么要做归一化normalization
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 基于webpack 的 vue 多页架构
  • 简析gRPC client 连接管理
  • 聊一聊前端的监控
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 智能网联汽车信息安全
  • 阿里云ACE认证之理解CDN技术
  • !$boo在php中什么意思,php前戏
  • ###C语言程序设计-----C语言学习(3)#
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (JS基础)String 类型
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二)Linux——Linux常用指令
  • (二)学习JVM —— 垃圾回收机制
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (十六)Flask之蓝图
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)h264中avc和flv数据的解析
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .aanva
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net refrector
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .net流程开发平台的一些难点(1)
  • .NET使用存储过程实现对数据库的增删改查