Git的常⽤命令Git常⽤命令汇总以及其它相关操作⼀、常⽤的git命令
--⽂件⽬录操作命令
mkdir * 创建⼀个空⽬录 *指⽬录名
pwd显⽰当前⽬录的路径。
cat * 查看*⽂件内容
git rm * 删除**⽂件
--git初始化操作
git init 把当前的⽬录变成git仓库,⽣成隐藏.git⽂件。
git remote add origin url 把本地仓库的内容推送到GitHub仓库。
git clone git@url/test.git 从远程库克隆
git add * 把x⽂件添加到暂存区去。
git commit –m "*"提交⽂件 –m 后⾯的是注释。
--git 克隆分⽀
git clone xxx.git 最简单直接的命令
git clone xxx.git "指定⽬录" clone到指定⽬录
git clone -b branchname xxx.git clone时创建新的分⽀替代默认Origin HEAD(master)
--clone 远程分⽀
git clone 命令默认的只会建⽴master分⽀,如果你想clone指定的某⼀远程分⽀(如:dev)的话,可以如下:
1. 查看所有分⽀(包括隐藏的) git branch -a 显⽰所有分⽀
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
2. 在本地新建同名的("dev")分⽀,并切换到该分⽀
git checkout -t origin/dev
#该命令等同于:
git checkout -b dev origin/dev
--查看命令
git status 查看仓库状态
git diff * 查看X⽂件修改了那些内容
git log 查看历史记录
git reflog 查看历史记录的版本号id(记录你的每⼀次命令,不论是否提交)
git log --pretty=oneline 如果信息量太多可以进⾏⽐较好的列表显⽰
-
-版本回退
git reset –hard HEAD^ 回退到上⼀个版本
git reset --hard HEAD~第⼏个如果想回退到第3个版本,使⽤git reset –hard HEAD~3
git reset --hard 057d 回退到某⼀个具体的版本号
--撤销修改
git checkout file-name 恢复某个已修改的⽂件(撤销未提交的修改):
git revert HEAD 还原最近⼀次提交的修改:
git revert commit-id还原指定版本的修改
--分⽀管理
git branch 查看本地所有的分⽀
git branch -a 查看远程所有的分⽀
git branch name 创建分⽀
git branch –d dev 删除dev分⽀
git push origin --delete dev 删除远程的dev分⽀
git branch -m dev develop 重命名分⽀
git checkout –b dev 创建dev分⽀并切换到dev分⽀上
git merge dev 在当前分⽀上合并dev分⽀代
git push origin zyf-dev 把当前新增的zyf-dev分⽀推送到远程库(远程仓库没有给分⽀则会新建⽴该分⽀)
git checkout — * 把XX⽂件在⼯作区的修改全部撤销。
git checkout master 切换回master分⽀
git push --set-upstream origin dev 提交修改并创建远程分⽀dev
--tag相关操作
git tag 列出所有的tag
git tag name 打轻量标签 name
git tag -d name 删除本地的tag
git push origin --delete tag name 删除远程的tag
git show name 查看tag信息
git push origin name 将tag提交到远程
--隐藏的⽂件
git stash 把当前的⼯作隐藏起来等以后恢复现场后继续⼯作
git stash list 查看所有被隐藏的⽂件列表
git stash apply 恢复被隐藏的⽂件,但是内容不删除
git stash drop 删除⽂件
git stash pop 恢复⽂件的同时也删除⽂件
--查看远程库信息(git remote的⽤法)
git remote 查看远程库的信息
git remote –v 查看远程库的详细信息
git remote add name url 添加远程仓库
git remote rename oldname newname 重命名仓库
git remote rm删除仓库
--将远程分⽀拉取到本地
#⽅法⼀
git checkout -b 本地分⽀名x origin/远程分⽀名x提交的东西不能更改
#⽅法⼆
git fetch origin 远程分⽀名x:本地分⽀名x
--git pull操作
#git pull命令的作⽤是,取回远程主机某个分⽀的更新,再与本地的指定分⽀合并,基本的格式如下:
$ git pull <;远程主机名> <;远程分⽀名>:<;本地分⽀名>
#取回origin主机的next分⽀,与本地的master分⽀合并,需要写成下⾯这样
$ git pull origin next:master
#如果远程分⽀是与当前分⽀合并,则冒号后⾯的部分可以省略。
$ git pull origin next
#上⾯命令表⽰,取回origin/next分⽀,再与当前分⽀合并。实质上,这等同于先做git fetch,再做git merge。
$ git fetch origin
$ git merge origin/next
#在某些场合,Git会⾃动在本地分⽀与远程分⽀之间,建⽴⼀种追踪关系(tracking)。
#⽐如,在git clone的时候,所有本地分⽀默认与远程主机的同名分⽀,建⽴追踪关系,也就是说,本地的master分⽀⾃动”追踪”origin/master分⽀。
#Git也允许⼿动建⽴追踪关系。
$ git branch --set-upstream master origin/next
#上⾯命令指定master分⽀追踪origin/next分⽀。如果当前分⽀与远程分⽀存在追踪关系,git pull就可以省略远程分⽀名。
$ git pull origin
--git 设置⼤⼩写敏感
Windows上的Git默认是⼤⼩写不敏感的,这样多平台写作就可能会出现问题。Win上的Git设置为⼤⼩写敏感的命令如下
git config core.ignorecase false
-
-git 设置忽略⽂件或⽂件夹权限修改
git config core.filemode false
--创建追踪分⽀
不带任何参数的git push,默认只推送当前分⽀,这叫做simple⽅式。
此外,还有⼀种matching⽅式,会推送所有有对应的远程分⽀的本地分⽀。Git 2.0版本之前,默认采⽤matching⽅法,现在改为默认采⽤simple⽅式。如果要修改这个设置,可以采⽤git config命令。
$ git config --global push.default matching
# 或者
$ git config --global push.default simple (最好使⽤这种⽅式)
$ git branch --track master origin/master //在使⽤ git branch 命令时加上 '--track' 参数, 来⼿动创建⼀个追踪分⽀
--切换git 命令提⽰中⽂到英⽂
// ubuntu装的git不知道怎么就出现全中⽂的提⽰,不太好,果断切换到中⽂了,切换⽅法如下:
// 1:写⼊
echo"alias git='LANG=en_GB git'" >> ~/.bashrc
// 2:⽣效
source ~/.bashrc
--git 删除未添加到版本中的⽂件或者⽂件夹
git checkout 只能回退在版本中的修改或者删除, 对于新添加的⽂件是没有作⽤的, 也就是说, 新建的⽂件或者⽂件夹是:Untracked files, 要删除或者清理掉这些⽂件,需要使⽤git clean 命令:
// 删除 untracked files
git clean -f
// 连 untracked 的⽬录也⼀起删掉
git clean -fd
// 连 gitignore的untrack ⽂件/⽬录也⼀起删掉(⼀般这个是⽤来删掉编译出来的 .o⼀类的⽂件)
git clean -xfd
// 在使⽤清理 git clean之前,建议加上 -n 来先看看会删掉哪些⽂件,防⽌重要⽂件被误删
git clean -nxfd
git clean -nf
git clean -nfd
三、常出错误:
1:There is no tracking information for the
则说明本地分?⽀和远程分?⽀的链接关系没有创建,⽤命令:
git branch --set-upstream branch-name origin/branch-name。
2: ![rejected] dev -> dev (non-fast-forward) ... Updates were rejected because the tip of your current branch
推送失败,因为远程代码的最新提交和你试图推送的提交有冲突,解决办法也很简单,先⽤git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送
3:CONFLICT (content): Merge conflict in . . .
这回git pull成功,但是合并有冲突,需要⼿动解决,解决的⽅法和分⽀管理中的解决冲突⼀样。解决后,提交,再push:
4: You are not currently on a branch, so I cannot use any
解决办法:git checkout master
5:Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
上⾯的显⽰的意思是,有⼀个更新还没有反应到本地来,可能是别⼈往server上提交了⼀点东西。
可以使⽤git pull命令拿这些更新到本地来。
6:在执⾏ git push 时可能会看到如下消息:
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simpl
解决办法:‘matching’ 参数是 Git 1.x 的默认⾏为,如果你执⾏ git push 但没有指定分⽀,它将 push 所有你本地的分⽀到远程仓库中对应匹配的分⽀。⽽ Git 2.x 默认的是
simple,意味着执⾏ git push 没有指定分⽀时,只有当前分⽀会被 push 到你使⽤ git pull 获取的代码。
根据提⽰,修改git push:
git config --global push.default matching
再次执⾏git push 就⾏了。
7:
You asked to pull from the remote 'origin', but did not specify:a branch. Because this is not the default configured remotefor your current branch, you must specify a branch on the command line.
解决办法:到:.git/config 修改如下
[branch "master"]
remote = origin
merge = refs/heads/master
8:ERROR: Permission to user1/test.git denied to user2 fatal: The remote end hung up unexpectedly
账户冲突,下⾯有针对讲解
9: 添加的ssh不起作⽤?
ssh 的添加⼀定要在root⽤户权限在添加,其他的权限不起作⽤,切记!
四、经验之谈:
1:git revert 和 git reset的区别
开始感觉两者⼀样,但是在客户端和命令⾏窗⼝操作之后发现⼤⼤的不同,看⼀个例⼦:我先提交三次1,2,3 id号分别是(15d5f70,a167eb1,8fbfe3f)如下图
然后执⾏版本回退 git reset –hard a167 如图:
说明执⾏git reset –hard ** 版本回退是撤销某次提交,但是此次之后的修改都会被退回到暂存区,因为上⾯显⽰有提交(by 1 commit)
同理执⾏ git revert –hard a167
git revert是⽤⼀次新的commit来回滚之前的commit
在回滚操作上看,效果⼀样。但是在⽇后继续merge以前的⽼版本时有区别。revert是⽤⼀次逆向的commit“中和”之前的提交,因此⽇后合并⽼的branch时,导致这部分改
变不会再次出现,但是reset是之间把某些commit在某个branch上删除,因⽽和⽼的branch再次merge时,这些被回滚的commit应该还会被引⼊。
得到结论:git reset 是把HEAD向后移动了⼀下,⽽git revert是HEAD继续前进,
只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
这样在版本回退的时候就⽐较的好,⽐如本地dev分⽀,远程master分⽀,某⼀次的上线发现线上有重⼤的bug,然后你reset本地代码到前⼀个版本,在你git push 的时候
git会报⼀个错误:“说你的本地分⽀版本低于远程master分⽀的版本,让你先去pull 下来代码,再提交”,这就不⾏了,你pull下来的代码还是最新版有bug的代码,不进⾏pull代
码,master分⽀⼜不让你提交。解决这个问题还得使⽤ revert 来进⾏ “回退”操作,为什么加引号呢,是因为这种回退是向前提交⼀次中和了上次的修改,这就⽐较好了,这样你
revert之后相当于指针向前移动⼀次,本地版本dev⾼于远程master版本,这时你就可以git push 本地代码到远程了。也就是说,git reset 对未提交到(git push)远程的修改做回
滚⽐较好,如果要回滚本地,同时想远程也回滚,就要⽤到revert
五、常⽤修改:
1:避免每次提交都输⼊⽤户名和密码
原因是使⽤了https⽅式 puh 在termail⾥边输⼊ git remote -v 可以看到形如⼀下的返回结果
origin github/git/librarysystem.git(fetch)
origin github/git/librarysystem.git(push)
下⾯把它换成ssh⽅式的。
git remote rm origin
git remote add origin git@github:yu/demo.git
git push origin
2:添加忽略⽂件 .gitignore
.gitignore配置⽂件⽤于配置不需要加⼊版本管理的⽂件。
配置语法: "/" 开头表⽰⽬录; "*" 通配多个字符; "?" 通配单个字符 "[]" 包含单个字符的匹配列表; "!" 表⽰不忽略(跟踪)匹配到的⽂件或⽬录;
说明:git 对于 .ignore 配置⽂件是按⾏从上到下进⾏规则匹配的,意味着如果前⾯的规则匹配的范围更⼤,则后⾯的规则将不会⽣效;
⽰例:(1) foder/* 忽略⽬录foder下的全部内容,不管是根⽬录下的 /foder/ ⽬录,还是某个⼦⽬录 /list/foder/ ⽬录,都会被忽略。
(2) /foder/* 说明:忽略根⽬录下的 /foder/ ⽬录的全部内容;
(3) /*!.gitignore
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore⽂件,根⽬录下的 /fw/bin/ 和 /fw/sf/
注意问题: .gitignore⽂件只对还没有加⼊版本管理的⽂件起作⽤,如果之前已经⽤git把要忽略的⽂件纳⼊了版本库,就不起作⽤了。
3:如何在同⼀台电脑上使⽤两个git账户
问题描述:作为程序员有时候是有多个的项⽬,⽽且每个项⽬git的⽤户名,邮箱等,都不⼀样。就我来说,我在github上有⼀个账号,⾃⼰开发⼀些东西,同时我参与
的也有项⽬需要连接别⼈的github账号,在我电脑上只有⼀个git客户端,本地⼀个⾝份⽤户,开始的时候我⾃⼰开发是⽤ssh⽅式,参与的项⽬的是⽤https连接,但是https每次
都需要输⼊密码,⾮常不⽅便,所以想转成ssh连接,利⽤命令:
$ git remote rm origin
$ git remote add origin git@github:yu/demo.git
$ git push origin
转换成功,不幸的是push的时候出错了:ERROR: Permission to user1 denied to
这种情况的解决⽅式是⽅法,使⽤本地托管多个个ssh的密钥,不同的账号是⽤不同的密匙。
第⼀步:⽣成SSH Key
执⾏命令,如下图:
具体说明:
$ ssh-keygen -t rsa -C "your_email@youremail"
Creates a new ssh key using the provided email Generating public/private rsa key pair.
#输⼊将要保存的路径,我的默认为当前路径(/c/Users/zhaoyafei/.ssh/id_rsa),但是不能使⽤默认⽂件id_rsa,要添加新账户就要⽣起⼀个成新的好记的名字,例如id_rsa_work
Enter file in which to save the key (/c/Users/zhaoyafei/.ssh/id_rsa):
#输⼊回车后提⽰输⼊⼀个类似于密码的号,直接回车就⾏
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
第⼆步:识别新的私钥
默认SSH只会读取id_rsa,所以为了让SSH识别新的私钥,需要将其添加到SSH agent
ssh-add~/.ssh/id_rsa_work
//该命令如果报错:Could not open a connection to your authentication agent.可执⾏ ssh-agent bash 命令后再执⾏ssh-add -l 看是否成功。
第三步:修改config⽂件
该⽂件⽤于配置私钥对应的服务器。内容如下:
# Default github (默认的)
Host github
HostName github
User git
IdentityFile ~/.ssh/id_rsa
# second user(work@gmail)
Host github_work
HostName github
User git
IdentityFile ~/.ssh/id_rsa_work
这样配置,也就是使⽤hostname为github会根据⽤户名的不同,去使⽤不⽤的private key。github上,也可以添加对应的公钥。其实这个配置是关于ssh的与git⽆关,只是git使⽤的⽅式是ssh的⽅式。Host可随意,⽅便⾃⼰记忆,后续在添加remote是还需要⽤到。
第四步:将SSH key输⼊到GitHub⽹站中
将⽣成的id_rsa_work.pub输⼊到GitHub⽹站中就可以了,输⼊完成后单击Add key后,会看到git-tutorial已经被添加进去了。配置完成后,在连接⾮默认帐号的github仓库时,远程库的地址要对应地做⼀些修改,⽐如现在添加abc帐号下的⼀个仓库test,则需要这样添加:git remote add test git@github-work:abc/test.git #并⾮原来的
git@github:abc/test.git 这样每次连接都会使⽤id_rsa_abc与服务器进⾏连接。
注意:github根据配置⽂件的ail来获取github帐号显⽰author信息,所以对于多帐号⽤户⼀定要记得将ail改为相应的email(work@mail)。我遇到的问题是本地单⼀⽤户,链接不同的github账号,所以⽤户配置可以采⽤全局配置。如果不同本地⽤户(不同的⾝份标识,即需要本地使
⽤不同的⽤户名),那么git就不要使⽤有–global的配置,可以按照下⾯的⽅法:
1)设置局部的user.name和ail
git config user.name "xxxxxx"
git ail "xxx@xxx"
2)设置全局的user.name和ail
git config --global user.name "xxxxxx"
git config –-ail ""
六、题外话(相关概念)
Git - 版本控制⼯具
Git是⼀个开源的分布式版本控制系统,⽤以有效、⾼速的处理从很⼩到⾮常⼤的项⽬版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发⽽开发的⼀个开放源码的版本控制软件。Torvalds 开始着⼿开发 Git 是为了作为⼀种过渡⽅案来替代 BitKeeper,后者之前⼀直是 Linux 内核开发⼈员在
全球使⽤的主要源代码⼯具。开放源码社区中的有些⼈觉得 BitKeeper 的许可证并不适合开放源码社区的⼯作,因此 Torvalds 决定着⼿研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他⾃由软件项⽬中也使⽤了 Git。例如最近就迁移到 Git 上来了,很多 Freedesktop 的项⽬也迁移到了 Git 上。
Github - ⼀个⽹站,提供给⽤户空间创建git仓储,保存⽤户的⼀些数据⽂档或者代码等
作为开源代码库以及版本控制系统,Github⽬前拥有140多万开发者⽤户。随着越来越多的应⽤程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的⾸选⽅法。如前所述,作为⼀个分布式的版本控制系统,在Git中并不存在主库这样的概念,每⼀份复制出的库都可以独⽴使⽤,任何两个库之间的不⼀致之处都可以进⾏合并。GitHub可以托管各种git库,并提供⼀个web界⾯,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外⼀个项⽬进⾏分⽀的简易性。为⼀个项⽬贡献代码⾮常简单:⾸先点击项⽬站点的“fork”的按钮,然后将代码检出并将修改加⼊到刚才分出的代码库中,最后通过内建的“pull request”机制向项⽬负责⼈申请代码合并。已经有⼈将GitHub称为代码玩家的MySpace。
GitLab - 基于Git的项⽬管理软件
GitLab 是⼀个⽤于仓库管理系统的开源项⽬。使⽤Git作为代码管理⼯具,并在此基础上搭建起来的w
eb服务。三者都是基于git的,可以说是git的衍⽣品。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论