使用Git就记这几个命令
一、安装
1.在Linux上安装Git
如果用Debian或Ubuntu Linux,通过一条sudo apt-get install git就可以完成Git的安装。
老一点的Debian或Ubuntu Linux,要把命令改为sudo apt-get install git-core。
如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./config,make,sudo make install这几个命令安装就好了。
2.在Mac OS X上安装Git
一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。 二是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
3.在Windows上安装Git
直接从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,鼠标右击桌面出现Git Bash Here,就说明安装成功。 安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "用户名"
$ git config --global user.email "邮箱"
注意git config命令的 --global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。 邮箱最好是GitHub上注册的邮箱地址,用户名也最好是。
二、创建版本库
git命令跟Linux命令差不多。 使用mkdir 创建一个版本库,首先,选择一个合适的地方,创建一个空目录:
$ mkdir gitRepository
$ cd gitRepository
$ pwd
/Users/michael/gitRepository
第二步,通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /Users/michael/gitRepository/.git/
刚创建的是一个空的仓库(empty Git repository),当前目录下会多了一个.git的目录,这个目录是Git用来跟踪管理版本库的,不要手动修改这个目录里面的文件,搞坏了你就得重新再装了。
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
第三步,把文件添加到版本库 现在我们编写一个demo.txt文件,内容如下:
Git is a version control system.
要放到gitRepository目录下(子目录也行), 用命令git add 告诉Git,把文件添加到仓库:
$ git add demo.txt
用命令git commit 告诉Git,把文件提交到仓库:
$ git commit -m " demo file"
[master (root-commit) eaadf4e] demo file
1 file changed, 1 insertions(+)
create mode 100644 demo.txt
git commit 命令,-m后面输入的是本次提交的说明,可以输入任意内容,最好是要有意义的。 继续修改readme.txt文件,改成如下内容:
Git is a distributed version control system.
运行git status 命令看看结果:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: demo.txt
no changes added to commit (use "git add" and/or "git commit -a")
git status 命令可以让我们时刻仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。 使用git diff 命令看看具体修改了什么内容:
$ git diff demo.txt
diff --git a/demo.txt b/demo.txt
index 7950452..ee41969 100644
--- a/demo.txt
+++ b/demo.txt
@@ -1 +1 @@
-Git is a version control system.
\ No newline at end of file
+Git is a distributed version control system.
\ No newline at end of file
修改之后重新提交就可以了。 提交后,再用git status命令看看仓库的当前状态:
$ git status
On branch master
nothing to commit, working tree clean
用git log命 令查看每次提交的内容: 首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,,上一个版本就是HEAD^,上上一个版本就是HEAD^^ ,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
使用git reset 命令:
git reset --hard HEAD^
使用git checkout – file丢弃工作区的修改: 命令git checkout – demo.txt意思就是,把demo.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是demo.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是demo.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。 使用cat 命令查看内容:
$ cat demo.txt
Git is a distributed version control system.
用命令git reset HEAD <file> 可以把暂存区的修改撤销掉(unstage),重新放回工作区. 用rm 命令删没用的文件:
$ rm helloword.txt
最后要再使用git commit 提交后,确认删除。
$ git commit -m "remove demo.txt"
[master d46f35e] remove demo.txt
1 file changed, 1 deletion(-)
delete mode 100644 demo.txt
删错了,还是可以还原的,使用版本回退cheakout
三、远程仓库
1.创建SSH Key
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa 和id_rsa.pub 这两个文件,如果已经有了,可直接跳到下一步。如果没有,创建SSH Key:
$ ssh-keygen -t rsa -C "你的邮箱(GitHub邮箱)"
id_rsa 是私钥,id_rsa.pub 是公钥 在GitHub上添加SSH Key,选择setting→SSH and GPG keys→new SSH key 然后,填写名字,将id_rsa.pub 文件里的内容,粘贴到key中,然后,点击Add SSH key完成添加。
2.创建远程仓库
选择New repository创建目录 在本地的gitRepository仓库下运行命令:
$ git remote add origin git@github.com:lqq-qg(GitHub账户名)/demo(GitHub上的目录名).git
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
$ git push -u origin master
用git push 命令,实际上是把当前分支master推送到远程。 只要本地作了提交,就可以通过命令git push 将本地仓库同步的GitHub上。
$ git push origin master
第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。 注意 这里可能出现连接不到远程仓库,请检查远程仓库目录名是否正确,本地SSH是否生效。
3.删除远程库
使用git remote rm <name> 命令,建议先用git remote -v查看远程库信息:
$ git remote -v
origin git@github.com:lqq-qg/demo.git (fetch)
origin git@github.com:lqq-qg/demo-git.git (push)
根据名字删除origin:
$ git remote rm origin
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。
4.从远程仓库克隆
在远程仓库随意创建一个目录,初始化一个README.md文件。 使用命令git clone 克隆一个本地库:
$ git clone git@github.com:lqq-qg/hadoop.git
Cloning into 'hadoop'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
四、分子管理
使用git checkout 命令加上-b 参数表示创建并切换: 使用git branch 命令查看当前分支
$ git branch demo
$ git checkout demo
Switched to branch 'demo'
当前分支前面会标一个* 号。 使用git merge 命令用于合并指定分支到当前分支。
$ git merge dev
Updating d56f34e..b13d22e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
删除demo分支
$ git branch -d demo
Deleted branch demo(was b17d20e).
git switch
最新版本的Git提供了新的git switch 命令来切换分支. 创建并切换到新的dev分支:
$ git switch -c dev
切换到已有的master分支
$ git switch master
查看分支:git branch
创建分支:git branch
切换分支:git checkout 或者git switch
创建+切换分支:git checkout -b 或者git switch -c
合并某分支到当前分支:git merge
删除分支:git branch -d
禁用Fast forward 模式
使用--no-ff 方式的git merge 合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
Bug分支
Git提供了一个stash 功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支。 修复完成后,切换到master分支,并完成合并,最后删除分支。 用git stash list 命令查看隐藏的工作区。 恢复以往隐藏的工作区,有两种方法。 一是用git stash apply 恢复,但是恢复后,stash内容并不删除,你需要用git stash drop 来删除;
另一种方式是用git stash pop ,恢复的同时把stash内容也删了。 然后恢复指定的stash,用命令:git stash apply stash@{0} Git提供了一个cherry-pick 命令,能复制一个特定的提交到当前分支:
$ git cherry-pick 4c8095e4
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name> 强行删除。
多人协作:
首先,可以试图用git push origin <branch-name> 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull 试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch-name> 推送就能成功!
如果git pull提示no tracking information ,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name> 。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
通过git rebase : 特点:rebase操作可以把本地未push的分叉提交历史整理成直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。
使用命令git tag <name> 就可以打一个新标签: 用命令git tag 查看所有标签: 用git show <tagname> 查看标签信息: 可以创建带有说明的标签,用-a 指定标签名,-m 指定说明文字:
$ git tag -a v1.0 -m "version 1.0 released" 1096dba
注意 :标签是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
使用命令git push origin <tagname> 本地推送到远程: 使用git tag -d v1.0 删除错误 一次性推送全部尚未推送到远程的本地标签:
$ git push origin --tags
要删除远程标签,先删除本地标签,再删除远程:
$ git tag -d v1.0
$ git push origin :refs/tags/v1.0
使用git config --global color.ui true 设置内容颜色
.gitignore 文件
把要忽略的文件名填进去,Git就会自动忽略这些文件。 用git check-ignore 命令检查,.gitignore文件哪里写得有问题。
$ git check-ignore -v demo.class
.gitignore:3:*.class demo.class
.gitignore 的第3行规则忽略了该文件。 用git add -f 强制添加被排除的文件。
$ git add -f demo.class
把指定文件排除在.gitignore规则外的写法就是!+文件名。
配置别名
使用git config --global alias.别名 命令 配置别名:
$ git config --global alias.ci commit
提交就可以简写成:
$ git ci -m "bieming"
配置git reset HEAD 别名命令:
$ git config --global alias.unstage 'reset HEAD'
git unstage file == git reset HEAD file
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
|