git常用命令
文章目录
账号配置
-
MAC配置全局的git账户
查看所有账户信息
git config --list
查看当前全局的git账户信息
git config user.name git config user.email
添加/覆盖全局git用户名和邮箱
git config --global user.name "用户名" git config --global user.email "邮箱"
删除全局的git用户名和邮箱
git config --global --unset user.name "用户名" git config --global --unset user.email "邮箱"
-
Mac配置git SSH公私钥
查看本地ssh目录是否有公私钥
cd ~/.ssh
如果有删除,没有执行下命令创建
ssh-keygen -t rsa -C “邮箱账号” //一路回车即可生成 id_rsa 、id_rsa.pub
将id_rsa.pub 公钥拷贝至服务器的ssh中即可
cat id_rsa.pub
文件管理
-
查看当前分支本地文件状态
git status
-
查看当前分支本地修改文件具体信息
查看所有修改明细
git diff HEAD
查看具体文件修改明细( 例如:查看readme.txt修改内容)
git diff readme.txt
-
修改文件后推送到远端
查看修改的文件
git status
查看修改文件具体内容
git diff xxxx
将xxx文件添加到缓存区
git add xxxx
提交到本地库并添加提交说明,也可以不需要说明直接 git commit
git commit -m “提交说明”
提交到远程master分支
git push origin master
查看git提交日志
git log
回退
// 回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可; git reset --soft 需要回退的提交的id // 彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉; git reset --hard 需要回退的提交的id
分支管理
-
查看本地分支
git branch
-
查看远程分支
git branch -r
-
查看所有分支(本地&远程)
git branch -a
-
创建本地分支
git branch dev //dev 是分支名,可自定义
-
切换本地分支
git checkout dev //dev 是要切换目标分支名称
-
将本地分支push到远程(要切换到推送的目标分支上)
git push origin dev //dev 是要推送要远程的本地分支名称
-
删除本地分支
git branch -D dev //dev 是要删除的本地分支名称
命令行指引
Git 全局设置
git config --global user.name "username"
git config --global user.email "email"
git clone
程操作的第一步,通常是从远程主机克隆一个版本库,这时就要用到git clone
命令。
$ git clone <版本库的网址>
该命令会在本地主机生成一个目录,与远程主机的版本库同名。如果要指定不同的目录名,可以将目录名作为git clone
命令的第二个参数。
$ git clone <版本库的网址> <本地目录名>
git clone
支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。
$ git clone http[s]://example.com/path/to/repo.git/
$ git clone ssh://example.com/path/to/repo.git/
$ git clone git://example.com/path/to/repo.git/
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git/
$ git clone rsync://example.com/path/to/repo.git/
SSH协议还有另一种写法。
$ git clone [user@]example.com:path/to/repo.git/
$ git clone git@github.com:jquery/jquery.git
通常来说,Git协议下载速度最快,SSH协议用于需要用户认证的场合。各种协议优劣的详细讨论请参考官方文档。
git remote
为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote
命令就用于管理主机名。
不带选项的时候,git remote
命令列出所有远程主机。
$ git remote
origin
使用-v
选项,可以参看远程主机的网址。
$ git remote -v
origin git@github.com:jquery/jquery.git (fetch)
origin git@github.com:jquery/jquery.git (push)
上面命令表示,当前只有一台远程主机,叫做origin,以及它的网址。
克隆版本库的时候,所使用的远程主机自动被Git命名为origin
。如果想用其他的主机名,需要用git clone
命令的-o
选项指定。
$ git clone -o jQuery https://github.com/jquery/jquery.git
$ git remote
jQuery
上面命令表示,克隆的时候,指定远程主机叫做jQuery。
git remote show
命令加上主机名,可以查看该主机的详细信息。
$ git remote show <主机名>
$ git remote show origin
git remote add
命令用于添加远程主机。
$ git remote add <主机名> <网址>
$ git remote add origin git@github.com:jquery/jquery.git
git remote rm
命令用于删除远程主机。
$ git remote rm <主机名>
$ git remote rm origin
git remote rename
命令用于远程主机的改名。
$ git remote rename <原主机名> <新主机名>
$ git remote rename origin old-origin
远程创建一个新仓库,克隆到本地
-
在gitlab上新建一个项目然后在本地clone下来,
-
进入项目添加文件通过
git add
命令,将文件关联到git;git add file.txt
添加指定文件到gitgit add .
添加所有文件到git -
通过
git commit
命令提交关联到git到文件; -
通过
git push
命令将提交的文件推送到远程git仓库指定分支
git clone ssh://git@gitlab.xxxx.xxx:port/username/projectname.git
cd projectname
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
将本地现存项目推送到到远程仓库
- 进入本地现有项目文件夹
- 执行
git ini
初始化git命令 - 给当前项目添加远程仓库主机名称和地址
git remote add <主机名> <地址>
- 执行
git add .
命令将文件添加到git - 执行
git commit
命令将文件的文件提交到git - 执行
git push
命令将提交到文件推送到远程仓库
cd existing_folder
git init
git remote add origin ssh://git@gitlab.xxxx.xxx:port/username/projectname.git
git add .
git commit -m "Initial commit"
git push -u origin master
将本地已有的Git仓库项目推送到一个新的地址(或者说更改现有的git仓库远程地址)
- 进入本地已有git仓库项目
- 重命名当前项目远程仓库的主机名称
git remote rename <原主机名> <新主机名>
- 重新设置当前项目的远程仓库主机名和地址
git remote add <主机名> <地址>
- 将当前项目全部文件推送到新仓库
git push -u <当前项目远程主机名> --all
- 将当前项目的标签推送到新仓库
git push -u <当前项目远程主机名> --tags
cd existing_repo
git remote rename origin old-origin
git remote add origin ssh://git@gitlab.xxxx.xxx:port/username/projectname.git
git push -u origin --all
git push -u origin --tags
git地址迁移
-
查看当前仓库地址
git remote show origin
-
更改项目git地址(迁移)
-
方式一
通过set-url origin 指定远程仓库地址
git remote set-url origin [新地址]
-
方式二(会产生两个远程分支old-origin和origin)
1、重命名当前远程分支;2、添加当前远程分支的新地址
//重命名当前远程分支为 old-origin git remote rename origin old-origin git remote add origin [新地址]
-
一台主机配置可访问多个github仓库地址
在常规开发中,我们的一台设备(主机),一般会设置一个github仓库地址。如果主机需要访问多个github仓库地址,需要将我们的ssh key添加到对应的github仓库的SSH keys
菜单中,遗憾的是对于同一个ssh key, github不支持添加到多个仓库中,否则会有如下提示:
Key is already in use
出现上述提示,则说明我们的ssh key已经被其他github仓库使用了,无法将其添加到该仓库。为了解决一台主机能够同时访问多个github仓库,这里我们需要在~/.ssh/
(mac环境)目录下,配置config
文件。
-
创建不同仓库的ssh key密钥对
参考上面Mac配置git SSH公私钥(我这里创建了两个github仓库的密钥对)
-
仓库1 ssh key密钥对
- 私钥:
repositry1_id_rsa
- 公钥:
repositry1_id_rsa.pub
- 私钥:
-
仓库2 ssh key密钥对
-
私钥:
repositry2_id_rsa
-
公钥:
repositry2_id_rsa.pub
-
-
-
配置github仓库ssh key
将两个仓库的公钥配置到对应的github仓库的ssh key内
-
配置config文件(如果没有则创建一个
touch config
)将两个仓库的私钥配置到config内
-
测试连接
终端通过ssh -T git@{Host} 命令测试配置是否成功,Host是我们config内配置的Host别名
ssh -T git@repository1 ssh -T git@repository2
如果出现如下提示,则说明我们配置成功
Hi XXXX! You've successfully authenticated, but GitHub does not provide shell access.
-
拉取项目
注意:
-
github上通过ssh 命令clone项目 ,标准的项目的ssh命令格式一般为
git@github.com:拥有者/项目名称.git
,例如:git@github.com:zcmain/Project1.git,当我们通过config配置好github仓库访问之后,我们需要更改clone的命令了,将标准的
git@github.com
替换为我们config内配置的具体仓库的Host
别名.
例如,我需要clone两个仓库的标准ssh 命令为:
# 仓库1的Project1项目的ssh命令 git@github.com:zcmain/Project1.git # 仓库2的Project2项目的ssh命令 git@github.com:tomato/Project2.git
通过我们上述config文件配置好的不同仓库Host来clone两个项目具体命令如下
# clone github仓库1的Project1.git项目 $ git clone git@repository1:zcmain/Project1.git # 这里指定了Host为repository1,拥有者为zcmain(github账号) # clone github仓库2的Project2.git项目 $ git clone git@repository2:tomato/Project2.git # 这里指定了Host为repository2,拥有者为tomato(github账号)
执行上述命令后,最终两个仓库项目都clone成功
Cloning into 'Project1'... remote: Enumerating objects: 2906, done. remote: Total 2906 (delta 0), reused 0 (delta 0), pack-reused 2906 Receiving objects: 100% (2906/2906), 1.52 MiB | 222.00 KiB/s, done. Resolving deltas: 100% (955/955), done. Cloning into 'Project2'... remote: Enumerating objects: 2105, done. remote: Total 2105 (delta 0), reused 0 (delta 0), pack-reused 2105 Receiving objects: 100% (2105/2105), 1.48 MiB | 195.00 KiB/s, done. Resolving deltas: 100% (488/488), done.
-
git 给远程库 添加多个url地址
原文地址
一般来说,我们为git增加远程库,一般都是
git remote add origin <url>
但是你可能想要把你的本地的git库,既push到github上,又push到开源中国Git@OSC上,怎么解决呢 ?有人可能会用两个甚至多个远程库,即再添加一个远程库
git remote add origin2;
这个方法很低效,因为你要git push 两次才能完成push到两个库。其实还有一个方法,git的一个远程库 可以对应多个地址,让远程库origin拥有多个url地址。 方法如下:
首先,我们从零开始, 假设你现在想要增加3个远程库地址,分别为 :
// url 1
https://git.oschina.net/shede333/swioslibary.git
// url 2
https://git.oschina.net/shede333/swscrollbar.git
// url 3
https://github.com/shede333/CoreAnimationTestSW.git
首先,先增加第一个地址 (add
)
git remote add origin <url1>
然后增加第二个地址(set-url
)
git remote set-url --add origin <url2>
增加第三个地址(set-url
)
git remote set-url --add origin <url3>
…依次类推
这样就完成了添加多个地址到origin库中了, 以后只要使用git push origin master
就可以一次性push到3各库的master分支里面了(使用git push也可以推动到当前默认分支)。
原理解析:
git remote set-url --add origin
就是往当前git项目的config文件里增加一行记录。
config文件打开方式有两种:
- 使用命令
git config -e
- 在当前git项目的根目录下,文件位于
.git/config
(.git目录为隐藏文件)
你每执行一次git remote set-url --add origin
就会增加一行,如下图:
git remote -v
显示当前所有远程库的详细信息,显示格式为 远程库名字 url连接(类型)
所以说,你直接在config里面直接添加url来修改也是可以的,不必去执行git命令。
注意
使用git push origin master
时,你可以push到origin的多个url地址,
但是使用 git pull
时,只能拉取origin里的一个url地址(即fetch-url,如上图),这个fetch-url默认为 你添加的到origin的第一个地址,
如果你想更改,只需要更改config文件里,那三个url的顺序即可,fetch-url会直接对应排行第一的那个url连接。
常见错误及解决方案
Git在push推送时,报错提示信息如下:
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
是由于本地和远程仓库两者代码文件不同步,因此需要先pull,进行合并然后再进行push
解决方案
- 先使用pull命令:
git pull --rebase origin master
- 再使用push命令:
git push -u origin master