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