git 常用命令
GIthub配置Git
SSHKEY 配置 详见:http://www.bjpowernode.com/tutorial_git/1859.html
添加远程仓库地址((将本地代码库的当前分支与远程的git代码库相关联)
git remote add origin git@github.com:yourName/yourRepo.git
后面的yourName和yourRepo表示你再github的用户名和远程仓库地址
移除远程仓库地址,移除后可执行 remote add 添加新的仓库地址
git remote rm origin
初始化: git init
对现有的某个项目开始用 Git 管理
初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
增加版本控制文件: git add
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add
命令告诉 Git 开始对这些文件进行跟踪,然后提交
$ git add *.c
$ git add README
$ git commit -m 'initial project version'
克隆: git clone
如果想对某个开源项目出一份力,可以先把该项目的 Git 仓库复制一份出来,这就需要用到 git clone
命令
查看状态变化: git status
要确定哪些文件当前处于什么状态,可以用 git status 命令。如果在克隆仓库之后立即执行此命令,会看到类似这样的输出:
$ git status
On branch master
nothing to commit, working directory clean
这说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪的新文件,否则 Git 会在这里列出来。最后,该命令还显示了当前所在的分支是 master,这是默认的分支名称,实际是可以修改的
提交: git commit
确认还有什么修改过的或新建的文件还没有 git add
过,否则提交的时候不会记录这些还没暂存起来的变化。所以,每次准备提交前,先用 git status
看下,是不是都已暂存起来了,然后再运行提交命令 git commit
:
$ git commit
这种方式会启动文本编辑器以便输入本次提交的说明。
另外也可以用 -m 参数后跟提交说明的方式,在一行命令中提交更新:
git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 3 insertions(+)
create mode 100644 README
推送:git push
git push -u origin master (把当前分支推送到远程的代码库)
新建分支: git branch
建一个新的分支指针。比如新建一个
iss53 分支,可以使用 git branch
命令:
git branch iss53
这会在当前 commit 对象上新建一个分支指针
运行 git branch
命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,所以在这个例子中,我们依然还在 master 分支里工作
现在,你决定要修补问题追踪系统上的 #53 问题。要新建并切换到该分支,运行 git checkout
并加上 -b
参数:
$ git checkout -b iss53
Switched to a new branch 'iss53'
这相当于执行下面这两条命令:
$ git branch iss53
$ git checkout iss53
切换分支: git checkout
要切换到其他分支,可以执行 git checkout
命令。我们现在转换到新建的 testing 分支:
git checkout testing
合并分支: git merge
有必要作些测试,确保修补是成功的,然后回到 master
分支并把它合并进来,然后发布到生产服务器。用 git merge
命令来进行合并:
$ git checkout master
$ git merge iss53
Updating f42c576..3a0874c
Fast-forward
README | 1 -
1 file changed, 1 deletion(-)
请注意,合并时出现了“Fast forward”的提示。由于当前 master
分支所在的提交对象是要并入的 iss53
分支的直接上游,Git 只需把 master
分支指针直接右移。换句话说,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。
回滚代码: git reset
通过reset的方式,把head指针指向之前的某次提交,reset之后,后面的版本就找不到了
这次主要使用git reset。
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard commit_id 退到/进到 指定commit_id
$ git push --force 强制推送到远程,千万不要拉取,否则又会把最新提交拉下来
使用 git log --pretty=oneline 列表最近的版本
回滚到指定版本
git reset --hard 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
撤消指定版本: git revert
原理: git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:
git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。
举例:
现在库里面有三个文件:READ.md、text.txt、text2.txt。
可以通过命令行查看(输入git log):
使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交:
git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb9861
注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名。
提交,使用“git commit -m 版本名”,如:
git commit -m "revert add text.txt"
此时可以用“git log”查看本地的版本信息,可见多生成了一个新的版本,该版本反做了“add text.txt”版本,但是保留了“add text2.txt”版本:
使用“git push”推上远程库:
此时查看仓库的文件,剩下两个:READ.md、text2.txt
忽略某些文件
我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个名为 .gitignore
的文件,列出要忽略的文件模式。来看一个实际的例子:
$ cat .gitignore
*.[oa]
*~
第一行告诉 Git 忽略所有以 .o
或 .a
结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。第二行告诉 Git 忽略所有以波浪符(~
)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。此外,你可能还需要忽略 log
,tmp
或者 pid
目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore
文件的习惯,以免将来误提交这类无用的文件。
文件 .gitignore
的格式规范如下:
- 所有空行或者以注释符号
#
开头的行都会被 Git 忽略。 - 可以使用标准的 glob 模式匹配。
- 匹配模式最后跟反斜杠(
/
)说明要忽略的是目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(
!
)取反。
.gitignore
文件的例子:
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in
配置代理
只对 github 的 clone 仓库配置:进入 github clone 仓库,运行
git config --local http.proxy 192.168.4.12:8080
之后就可以看到 .git/config 文件中多了最下面两行
[http]
proxy = 10.xx.xx.xx:8080
全局配置 代理,对所有的提交行为都生效
git config --global http.proxy 192.168.4.12:8080