git命令使用方法

git安装包

http://c35.yunpan.360.cn/my/?sid=#%2F%E5%AE%89%E8%A3%85%E5%8C%85%2FGit%E5%AE%89%E8%A3%85%2F

git安装时秘钥生成步骤

1. git config --global user.name xxx
2. git config --global user.email [email protected]
3. ssh-keygen -C [email protected] -t rsa //第3步分为下面3个小步骤
(1)公钥保存地址 按回车选择默认
(2)私钥密码-为了后续使用方便 设置为空
(3)生成公钥和私钥

identification has been saved in /c/Users/xxx/.ssh/id_rsa.public key has been saved in /c/Users/xxx/.ssh/id_rsa.pub.

// git公钥------/c/Users/xxx/.ssh/id_rsa.pub.文件中的内容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/pYFUKMZUPNJtjOdSQl74GH4JxAQ8F+EqaMoR9Yw+5VNW81eWrrbbSsjpEDPaZIbb0Sc89oJ4Uzi2lpHjhTujMmdzf2TrfOaGRa2+M5Ey4Z1MXuT4RVawrZ/PtK7tTI+eMKc/NZqhcp9e+NYIVzbwUMqvAnx+OTgDF3RYmYWDcbvTX0AybOBd/NwV1BtR5PkPRHlGQN0Oi5wHmvXmP9WIQ9dAoi+w63mhL+c8a8Qu+PBZBiknzJRB1p9dtIOEPdq5ltGAqluEZ0FTEzet1qH0pAUaOxxEsZAhGpa9453rQJ433Emg7hy30KomOQvFp64T6QlTGFKIg9EMm9t8Ny2r [email protected]

git协议误区使用SSH协议可以避免每次push输入密码。前提是在账户里配置好SSH秘钥。 [email protected]开头的就是SSH协议。 使用Https协议则会导致每次都会输入用户名和密码。

git bash命令窗口和字体的大小设置

鼠标点击git bash界面的标题栏,鼠标右键选择

// 窗口尺寸设置

options --> windows -->修改行数(高度)+列数(宽度)

// 窗口字体设置

options --> text -->设置字体大小

// 别的设置可参考此文

http://my.oschina.net/lieefu/blog/476252

// 解决gitk在Windows下的中文乱码问题

http://howiefh.github.io/2014/10/11/git-encoding/

// 顺带了解一下win7的命令窗口设置

http://article.pchome.net/content-1245289-all.html

创建本地库

// 从零开始创建1.git init                  创建一个空的Git库。在当前目录中产生一个.git 的子目录。以后,所有的文件变化信息都会保存到这个目录下
2.git init --bare           创建远端仓库(在服务器或者工程目录以外路径都可以创建的备份仓库)

// 克隆已有仓库创建
git clone /path/to/repository                                                             // 本地库
git clone  git/ssh/http[s]/ftp[s]/file/rsync:[email protected]/path/to/repository               // 远端服务器

git clone的本质就是把“Git目录”里面的内容拷贝过来,一般的“Git目录”里有成千上万的各种对象(提交对象,树对象,二进制对象, tag对象......),如果逐一复制的话,其效率就可想而知。

如果通过git、ssh协议传输,服务器端会在传输前把需要传输的各种对象先打好包再进行传输;而http(s)协议则会反复请求要传输的不同对象。如果仓库里面的提交不多的话,前者和后者的效率相差不多;

但是若仓库里有很多提交的话,git、ssh协议进行传输则会更有效率。不过现在Git对http(s)协议传输Git仓库做了一定的优化,http(s)传输现在也能达到ssh协议的效率


// 详细请参考  本地仓库的创建和构成

http://www.infoq.com/cn/news/2011/02/git-adventures-local-repository

 
.git目录的组成

COMMIT_EDITMSG         # 保存着上一次提交时的注释信息
config                      # 项目的配置信息
description                 # 项目的描述信息
HEAD                        # 项目当前在哪个分支的信息index                       # 索引文件,git add之后要添加的内容暂存在这里
hooks/                      # 默认的“hooks” 脚本文件
info/                       # 里面有一个exclude文件,指定本项目要忽略的文件 #,看一下这里
logs/                       # 各个refs的历史信息
objects/                    # 这个目录非常重要,里面存储都是Git的数据对象
                            # 包括:提交(commits), 树对象(trees),二进制对象 #(blobs),标签对象(tags)。                            # 在objects目录下,SHA串的前两个字符作为目录名,后面的38个字符作为文件名
refs/                       # 标识着你的每个分支指向哪个提交(commit)。
// 查看提交文件的内容,2d832d是SHA(安全hash算法)签名值
$ git cat-file -p 2d832d

工作流

本地和远程工作流

你的本地代码 由 git 维护的三棵“树”组成。第一个是你的 工作目录,它持有实际文件;第二个是 缓存区(Index/stage),它像个缓存区域,临时保存你的改动;最后是本地仓库( HEAD),指向你最近一次提交后的结果。

git clone 用于建立本地仓库                     // origin 是git clone默认使用的远程主机名
通过git clone获取远端git库后,.git/config中的开发者信息不会被一起clone过来。仍然需要为本地库的.git/config文件添加开发者信息。此外,开发者还需要自己添加 . gitignore文件。 通过git clone获取的远端git库,只包含了远端git库的当前工作分支。如果想获取其它分支信息,需要使用 “git branch –r” 来查看, 如果需要将远程的其它分支代码也获取过来,可以使用命令 “ git checkout -b 本地分支名 远程分支名”,其中,远程分支名为 “git branch –r” 所列出的分支名, 一般是诸如“origin/分支名”的样子。如果本地分支名已经存在, 则不需要“-b”参数。 
git fetch 

从远程获取最新版本到本地,不会自动merge,比git pull更安全些。 例如:如果使用git checkout nov/eclair_rocket (nov/eclair_rocket为服务器上的分支名),则是获取上次使用git fetch命令时从服务器上下载的代码;如果先使用 git fetch ,再使用git checkout nov/eclair_rocket,则是先从服务器上获取最新的更新信息,然后从服务器上下载最新的代码。

git pull 从服务器的仓库中获取代码,和本地代码合并。等同于: Git fetch + Git merge这条命令将从远端git库的远端分支名获取到本地git库的一个本地分支中。其中,如果不写本地分支名,则默认pull到本地当前分支。 如果你的本地分支已经有内容,则git pull会合并这些文件,如果有冲突会报警。 git pullgit push是针对所有分支进行的操作。也就是说即使我切换到一个次分支alpha, 如果这个分支和远端的分支已关联了的话,那么执行git pull会把master分支和alpha分支都更新到远端。

添加与提交

你可以计划改动(把它们添加到缓存区),使用如下命令:

git add dir1           添加dir1这个目录,目录下的所有文件都被加入 git add f1 f2          添加f1,f2文件 
git add *              git add -A             添加当前目录下的所有文件git add .              添加当前目录下的所有文件和子目录
git rm --cache a.c          删除已提交到本地仓库的文件

这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:

git commit -m "代码提交信息"
git commit -a -m "代码提交信息"    // git commit -a是把unstaged的文件变成staged(这里不包括新建(untracked)的文件),然后commit
 

现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

推送改动

你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:

git push origin mastergit push不会自动合并文件。因此,如果git push时,发生了冲突,就会被后push的文件内容强行覆盖,而且没有什么提示。 这在合作开发时是很危险的事情。 

可以把 master 换成你想要推送的任何分支。

如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:

git remote add origin <server>

如此你就能够将你的改动推送到所添加的服务器上去了

分支

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支上。

操作 详细命令
新建分支 git branch testing
切换分支 git checkout testing
删除分支 git branch -d testing
查看分支 git branch

创建一个叫做“feature_x”的分支,并切换过去:

git checkout -b feature_x

切换回主分支:

git checkout master

再把新建的分支删掉:

git branch -d feature_x

除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的

git push origin <branch>
// 重命名本地分支

git branch -m  branch-old-name  branch-new-name

更新

要更新你的本地仓库至最新改动,执行:

git pull  origin <remote-branch> <local-branch>git fetch origin <remote-branch>

标签

在软件发布时创建标签,是被推荐的。这是个旧有概念,在 SVN 中也有。可以执行如下命令以创建一个叫做 1.0.0 的标签:

git tag 1.0.0 1b2e1d63ff

1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。使用如下命令获取提交 ID:

git log

你也可以用该提交 ID 的少一些的前几位,只要它是唯一的。

 // 给tag添加注释

git tag -a v1.4 -m ‘my version 1.4‘
// 显示tag版本记录git show tag-name

// 一次性推送所有tag到远程服务器git push origin --tags
// 取出打过tag的某个版本 git checkout -b branch_name tag_name
// 删除tag时需注意,如果向远程服务器提交了tag,则删除tag时,不仅要删除本地的tag,还要删除远程的tag

// 删除本地的tag命令是

git tag -d tag-name

// 删除远程tag的命令是

git push origin --delete tag-name

替换本地改动

假如你做错事(自然,这是不可能的),你可以使用如下命令替换掉本地改动:

git checkout -- <filename>

此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到缓存区的改动,以及新文件,都不受影响。

假如你想要丢弃你所有的本地改动与提交,可以到服务器上获取最新的版本并将你本地主分支指向到它:

git fetch origin
git reset --hard origin/master

git 忽略文件的设置方式

可参考以下两个网址

// git ignore文件的三种设置方式

http://www.jianshu.com/p/267cd94f1d49

// git ignore文件设置的具体语法

http://www.cnblogs.com/pylemon/archive/2012/07/16/2593112.html#3226325

重点说一下踩过的坑:

.gitignore 文件可以忽略自己。忽略的文件,只针对未跟踪文件有效,对已加入版本库的文件无效。

git check-ignore 可用来检查所写的忽略文件语法是否正确

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了,比如分别输入Tags和SublimeText,在下面的网址中查询忽略规则

https://www.gitignore.io/

git 分支合并

假设此时,你突然接到一个电话说有个很严重的问题需要紧急修补,那么可以按照下面的方式处理:

  1. 返回到原先已经发布到生产服务器上的分支。
  2. 为这次紧急修补建立一个新分支,并在其中修复问题。
  3. 通过测试后,回到生产服务器所在的分支,将修补分支合并进来,然后再推送到生产服务器上。
  4. 切换到之前实现新需求的分支,继续工作。
$ git checkout -b iss53    // 在master分支上新建一个iss53分支

相当于执行下面这两条命令:

$ git branch iss53
$ git checkout iss53
// 将hotfix分支合并到master

$ git checkout master

$ git merge hotfix

合并时发生冲突的提示信息

$ git merge iss53  

Auto-merging index.html

CONFLICT (content): Merge conflict in index.html

Automatic merge failed; fix conflicts and then commit the result.

合并状态的查看

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。Git 会在有冲突的文件里加入标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突。可以看到此文件包含类似下面这样的部分:

<<<<<<< HEAD
<div id="footer">contact : [email protected]</div>
=======
<div id="footer">
  please contact us at [email protected]
</div>
>>>>>>> iss53

可以看到 ======= 隔开的上半部分,是 HEAD(即 master 分支,在运行 merge 命令时所切换到的分支)中的内容,下半部分是在 iss53 分支中的内容。解决冲突的办法无非是二者选其一或者由你亲自整合到一起。比如你可以通过把这段内容替换为下面这样来解决:

这个解决方案各采纳了两个分支中的一部分内容,而且我还删除了 <<<<<<<======= 和 >>>>>>> 这些行。在解决了所有文件里的所有冲突后,运行 git add 将把它们标记为已解决状态(译注:实际上就是来一次快照保存到暂存区域。)。因为一旦暂存,就表示冲突已经解决。

git branch -d studyGit     // 对studyGit分支进行合并后,才能删除得了studyGit分支

git branch -D studyGit    // 强制删除studyGit分支

再运行一次 git status 来确认所有冲突都已解决:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   index.html

如果觉得满意了,并且确认所有冲突都已解决,也就是进入了暂存区,就可以用 git commit 来完成这次合并提交。提交的记录差不多是这样:

// Git - 分支的新建与合并

https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6

git版本库回滚

1、git checkout the_branch

2、git pull

3、git branch the_branch_backup //备份一下这个分支当前的情况

4、git reset --hard the_commit_id //把the_branch本地回滚到the_commit_id

5、git push origin :the_branch //删除远程 the_branch

6、git push origin the_branch //用回滚后的本地分支重新建立远程分支

7、git push origin :the_branch_backup //如果前面都成功了,删除这个备份分支
 
--soft    回退commit

--mixed    回退commit和stage

--hard     回退commit stage workspace

//本地仓库回退到某个版本

git reset version_hash --hard

// 强制远程仓库回退到某个版本

git push 远程主机名 远程目录  -f
 

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

git log --pretty=oneline

你看到的一大串类似3628164...882e1e0的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

git reset --hard 3628164

在Git中,总是有后悔药可以吃的

git reflog  记录你操作的每一条指令

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

// 可参考这篇文章 版本回退

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000

// git revert

http://samael65535.github.io/git/2013/01/18/git/

有用的贴士

内建的图形化 git:
gitk
彩色的 git 输出:
git config color.ui true
显示历史记录时,只显示一行注释信息:
git config format.pretty oneline

想进一步了解git指令的话,可阅读下面两篇文章

git 入门级指令

https://github.com/guodongxiaren/LinuxTool/blob/master/git.md

git常用命令解说

http://zensheno.blog.51cto.com/2712776/490748

时间: 2024-08-29 10:15:35

git命令使用方法的相关文章

一些git命令使用技巧和常遇到的问题的解决方法

一些git命令使用技巧和常遇到的问题的解决方法 只有.git目录如何取代码 运行git reset --hard即可.运行后,会看到出现所有需要的目录了. Git am 合并 patch 时的冲突处理 (1)$ git am xxx路径/0001-BUG-Sybase.patchApplying: CHG: 读取Sybase如果时间为空,设置默认时间的修改error: patch failed: source.php:38error: source.php: patch does not app

git工具使用方法及常用命令

git下载地址:https://github.com/git/gitgit环境变量配置:增加:GIT_HOME = C:\Git (文件夹为git软件的安装文件夹)Path添加: %GIT_HOME%\bin;(bin目录是解压后出现的文件夹,里面有git.exe) git命令大全:pwd 输出clone到本地的路径dir 显示本地文件cd work进入文件夹git clone http://github.com/22337383/workgit clone -b v2 https://gith

git命令行使用

1. git命令行配置 1)安装完git客户端之后,在任意目录右键鼠标,选择Git GUI Here 2)在打开的窗口中依次选择Help->> Show SSH Key 2)如果弹出的窗口中中间部分没有key,可以点击 Generate Key 按钮,生成key,然后将生成的key拷贝一下,添加到gitlab中即可. 2. 命令使用 1)下载代码 在存放代码的目录中,右键鼠标,选择 Git Bash Here,然后会打开终端窗口 输入: git init   创建git配置目录 输入下面命令,

git命令评测

近日得知git命令在库进行操作,查找git尽管小命令(当然,也不能太小),但他们是一个非常强大的组合,更重要的是,它是非常的效果不同状态的命令是不一样的打.该博文总结git命令.. Git命令 命令小结 命令 功能 git init 把当前目录初始化为默认的git库 git add 文件名称 向git库中加入一个文件 git rm 文件名称 从git库中删除一个文件 git status 查看当前库中进行的任务 git diff 文件名称 add前查看工作区和暂存区的区别 git commit

常用Git命令汇总

常用Git命令汇总 跟着R哥来到了新公司(一个从硬件向互联网转型中的公司),新公司以前的代码基本是使用SVN做版本控制,甚至有些代码没有做版本控制,所以R哥叫HG做了一次Git分享,准备把公司所有的代码用Git作版本控制.平时自己虽然天天使用Git,但是总感觉知识有些零散,于是汇总了一些常用的Git命令. 常用配置 --system #系统级别 --global #用户全局 --local #单独一个项目 git config --global user.name "xxxx" #用户

工作常用git命令

克隆项目 git clone gitssh地址 提交前的准备 git config user.name 您的中文名 git config user.email 公司邮箱 获取分支 #### 将远端分支全部获取到本地 git fetch origin 拉取远端被跟踪分支并衍合 git pull -r 查看分支 查看本地分支 git branch 查看远程分支 git branch -r 查看所有分支 git branch -a 可以配合grep过滤想看的分支 例如可以查看1.3.5.0版本下所有的

小技巧--tab键自动补齐Git命令

Git是什么,你不清楚? 好吧,那么该篇内容对你也木有帮助,请绕道而行.. 我们在使用Git命令时,可以通过tab键,自动补齐Git,特别是在切换分支时特别有用. 如下,当我们想将当前分支切换到bugfix/DEV-31999-review-dialog-dose-not-show-scroll时,再此之前,要么傻兮兮的敲打分支名,要么复制粘贴: 但是,倘若我们可以通过tab键自动填充目的分支,岂不完美,如下: 下面就是关于设置mac下Tab键对git命令起作用的方法: Install Bash

如何用git命令行上传本地代码到github

注意:安装的前提条件是配置好Git的相关环境或者安装好git.exe,此处不再重点提及 上传的步骤: 本文采用git 命令界面进行操作,先执行以下两个命令,配置用户名和email[设置用戶名和e-mail地址.这是非常重要的,因為每次Git提交都会使用该信息.它被永遠的嵌入到了你的提交中] git config --global user.email "[email protected]"           git config --global user.name "Yo

【转载】git命令和svn的对比

首先,要明确的是,git和svn是完全不同的两种管理方式.他们的命令不是完全对等的. 下面只是一些相似方法的参考,而已. 参考 http://blog.csdn.net/chen198746/article/details/19117627 常用的svn与git命令对比如下: svnadmin create ------------------------------> git init svn co ------------------------------> git clone svn