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 来说该后缀名区分了是 project
、issues
、wiki
或是其他。你也可以换成 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
接受使用。