git常用命令
(1)安装:
1,ubuntu安装
▪添加源并安装:
#add-apt-repository ppa:git-core/ppa //配源
# apt update; //更新源
# apt install git
(2)配置Git
git config 用户配置文件路径:~/.gitconfig
列出当前配置信息:git config --list
配置当前用户名:git config --global user.name "testuser"
配置当前用户邮箱:git config --global user.email "testuser@qq.com"
(3)创建git仓库
有两种取得 Git 项目仓库的方法,仓库后缀为:.git ,仓库的信息保存在.git文件夹中。
①在现有项目或目录下导入文件到 Git 中。
新建仓库 git init
导入仓库: git add (file)
示例:
1,创建文件夹
mkdir test_dir_repo
2,新建测试文件
touch 1 2 3
3,新建仓库
git init #执行本步,目录下创建.git文件。此时,该目录就是一个git仓库。
4,向仓库导入文件
git add 1 #添加文件1,其实是添加到暂存区;
git add 2 #此处也可以用[git add .] 提交当前目录。
5,git commit #提交到仓库。
②从一个服务器克隆一个现有的 Git 仓库。
git clone url(链接)
1,创建文件夹
mkdir test_dir_repo
2,此时在线克隆的同时创建git仓库。
(4)基本命令
1,git status #当前状态
2,git add #添加到暂存区
3,git commit #提交
4,替换git commit编辑器:
git config core.editor vim #临时替换
git --global config core.editor vim #永久替换
5,git commit
git commit -m "commit message" #增加提交,生成commit-id
说明:使用此命令不用再跳转到输入commit信息的编辑器了。
6,git log
解释:查看提交历史,同时可以获得commit-id;但看不到被删除的commitid。
①git log --pretty=oneline #log显示为一行,看起来简洁明了。
②git log --pretty=oneline --graph #以图像的形式查看,当分支多时,效果很好。
③git reflog #查看所有分支的所有操作记录(包括已被删除的 commit 记录和 reset操作)
可以恢复到被删除的那个版本
7,git show commit-id
展示版本内容/提交信息;
※使用commit-id最少提供4个字符。
8,git rm #移除
git rm 1 #删除文件1,提交到暂存区
git commit #提交后,彻底删除。
9,git mv #移动
git mv 1.txt 2.txt #重名名1.txt为2.txt;提交到暂存区。
git commit #提交后,文件重命名成功。
10,git diff
①git diff #工作区的差异,即:会显示所有的文件变更差分。
②git diff --cached #暂存区的差异,即暂存区与本地工作目录的差异。
③git diff (commit id) (commit id) #比较两次commit的差异
④git diff file名 #显示某个文件的差异
11,git clean
解释:清除当前工作区未被git版本控制的文件;即未执行git add等操作的文件。
git clean -df #可以删除所有未git的文件;当然此时也可以用linux的rm删除。
12,.gitignore (隐藏文件)
▪解释:指定要忽略的故意未跟踪文件
▪应用场景:在项目开发过程中,可能会产生一些不需要加入git控制的文件,但是我们不能删除它。
▪说明:.gitignore放在当前git仓库根目录下(与.git同级)。
▪使用方法(例):
touch .gitignore
git add .gitignore
git commit -m "test .gitignore"
vim .gitignore文件 #在此文件中,输入忽略的文件名。(文件名后不能有空格,一行一个)
然后:git add .gitignore
git commit -m "test .gitignore ignore filename"
再查看:git status #不愿git的文件,不会显示为红色;和其它git管理的文件一致。
★可以隐藏某种类型的文件,如(*.xml),只需在.gitignore中输入*.xml即可。
13,HEAD 头部
▪解释:
HEAD 文件是一个指向你当前所在分支的引用标识符 ;
指向你正在其基础上进行工作的提交记录;
HEAD是一个文件,指向当前的提交记录;
位于.git目录下;
指向关系:.git/HEAD -> refs/heads/master -> a60562sh9
查看:.git/HEAD
13.1 HEAD 扩展
-
符号 ^ (shift + 6) :根据^的个数,查看前面若干个提交;
-
符号 ~ (shift + `):用于查看跨度较大的父提交时使用;例:不能打100个^号。
※缺点时不能查看Merge的父提交。
-
detach 分离:例如做了git checkout HEAD~2操作,此处将处于分离状态;如果
此时做了一系列修改和切换操作,想再返回detach状态,可执行:git checkout detach;或者通过get reflog信息(commit-id)返回。
例:
查看前一个提交:git show HEAD^ #也是第一个父提交;
查看第1个父提交的父提交:git show HEAD^^
查看Merge前的第2个父提交: git show HEAD^2
查看第2个父提交的父提交:git show HEAD^2^
查看第2个父提交:git show HEAD~2
查看第3个父提交:git show HEAD~3
查看第100个父提交:git show HEAD~100
14,git checkout commit-id (检出)
切换分支:git checkout branchname #检出指定的提交记录到工作目录。
git checkout master:切换到master分支;
它与git reset的区别是:切换到某个提交记录后,历史记录还存在,还可以返回。
15, git reset
git reset commit-id (重置)
▪解释:撤销之前的提交记录。
假如有1,2,3这3条记录,如果git reset 2;那么3的记录将删除。
▪进一步解释,下面是提交的三个过程:
1、工作目录新建文件 a
2、使用git add把a加入到暂存区
3、使用git commit把a提交到本地仓库
不带参数,直接执行完git reset之后,相当于撤销了2,3两步,第一步创建的文件a还在当前工作目录中。
▶git reset参数
①git reset --soft "commit id"
回退git commit
②git reset (--mixed) "commit id" #不带参数的默认行为
回退git commit,回退git add
③git reset --hard "commit id"
回退git commit,回退git add,回退工作区修改
▶git reset 恢复
git reset --soft "commit id"的恢复:再执行git commit(文件名);但此时的commit id已改变。
git reset --mixe "commit id"的恢复:git add (文件名);git commit(文件名)#commit id已变
git reset --hard "commit id" && git reflog #reflog就是HEAD的变化Log.
commit-id HEAD 动作
4220bf5 HEAD@{0}: reset: #状态2
cc29b12 HEAD@{1}: commit: 3 #状态3
git reset --hard cc29b12 #相当于回到了commit3, 撤销了撤销动作,其实就是恢复。
解释:执行git reset --hard "状态2的commit id" 回到了状态2,此时状态3已被删除。
通过git reflog查到状态3的commit id,再执行git reset --hard "状态3的commit id",相当于又恢复到了状态3,commit id不变。
▶git reset 与 git checkout的区别
※此处的安全指恢复的难易度。
※For 文件:对当前工程的单个文件进行操作,此时不能加参数。
16,git checkout -- <file>
▪丢弃工作区的修改
▪case 1 : 没有加入暂存区
git checkout -- file 相当于从本地仓库获取内容到工作目录,此时工作区的修改将因覆盖而被丢弃。
▪case 2:加入暂存区
git checkout -- file 相当于从暂存区获取内容到工作目录,即add到暂存区后的本地修改将因覆盖而被丢弃。
17,git revert (重新提交)
18,分支 (branch)
Git 的分支,其实本质上仅仅是指向提交对象的可变指针。
master:为git默认分支
branch:为新建分支
18.1创建分支
git branch 查看分支
git branch branch1 //创建branch1分支,但HEAD还在master分支上;
git checkout -b branch1 //创建branch1分支,同时HEAD转移到branch1分支上;
19,git merge (合并)
①git checkout master //先切换到master分支
②git merge branch1 //再合并branch1到master,此时为重新生成一个新的提交。
20,git rebase(变基)
21,git cherry-pick
22,conflict (冲突)
解释:当两个分支对同一个文件同一行做出了修改,就会产生冲突。
解决冲突后,继续提交的方法:
①git merger 继续提交:git add;git commit
②git rebase 继续提交:git add;git rebase --continue
③git cherry-pick 继续提交:git add;git cherry-pick --continue
此时,还有小问题,无论如何都提交,再使用:git commit --allow-empty 可以完成提交。
23,git branch 参数
查看所有分支:git branch -a(all)
git branch -D branch_01 删除分支 #若当前HEADER在branch_01上,则不能删除;需先切换分支
git branch -vv 显示详细信息
git branch -u 跟踪分支
24,git 重写历史
▪修改最后一次的提交message:git commit --amend
例:git commit --amend -m "新的commit Message"
▪修改中间某次的提交message:git rebase -i HEAD~* //*号用具体的数字。
此时,将显示提交信息,对内容做如下修改:
①edit:编辑某个提交内容,则会修改此提交内容
②删除一行:删除某个提交记录,则删除那个提交
③squash:压缩提交,即将多个提价合并成一个提交。
25,git stash (隐藏)
git stash:在切换分支前,隐藏暂未提交的改动
git stash list:显示隐藏
git stash pop:弹出隐藏
git stash apply:应用隐藏,此时并没有弹出;即在stash list还存在。
git stash --all:隐藏目录下所以改动
26,git bundle (打包)
说明:打包git仓库。
打包:git bundle create [*.bundle] HEAD [branch name]
[*.bundle]:为打包后生成的bundle名;例:test.bundle
[branch name]:被打包的分支名;例:master,branch01
例:git bundle create test.bundle HEAD master
解包:git clone *.bundle #把打包的仓库解压出来
例:git clone test.bundle
27,git patch(补丁)
•git diff:制作补丁 通用的patch git apply:打补丁
git diff [commitid] [commitid] > [test.patch] 例:git apply test.patch
特点:不会自动提交;轻便;不够详细
•git format-patch:制作补丁 git专用补丁 git am:打补丁
git format-patch [commit-id] [-number] #对于该commit-id 向前数第number个提交。
打入某个提交的补丁;会自动提交这个补丁的内容
特点:很详细;文件比较多
28,git tag (标签)
新建标签:git tag [tag name] 例:git tag version01
显示全部标签:git tag
显示标签内容:git show [tag name]
轻量级标签:git tag [tag name]
附注标签:git tag -a [tag name] -m [message]
删除标签:git tag -d [tag name]
29,远程仓库
①git remote 命令:显示远程仓库 #origin为默认远程仓库
②添加远程仓库 #把远程仓库添加到本地;
git remote add <remote repo> <url> #<remote repo>为远程仓库名在本地的名称(可与远程仓库相同,也可以启个别名);<url>为远程仓库的url.
③添加远程仓库分支
git branch <new branch> #new branch为新建分支名称;
git push <remote repo> <new branch> #<remote repo>为远程仓库名。
④移除远程仓库
git remote rm <remote repo>
⑤移除远程仓库分支
git push <remote repo> --delete <branch>
30,git push (推)
基本命令: git push <remote name> <local branch>:<remote branch>
例:git push orange master:master #本地和远程都是master分支。
作用:把本地的修改推到远程仓库,并把相应的本地远程仓库分支更新到最新。
31,git fetch(取)
基命令:git fetch <remote name> <remote branch> #<remote name>为远程仓库名称;
作用:获取远程仓库的更新到本地远程仓库分支,本地分支不变
32,git pull (拉取)
基本命令:git pull <remote name> <remote branch>
作用:拉取远程仓库的更新,并和本地仓库当前分支合并
★git pull扩展
git pull = git fetch + git merge
例:
git pull origin master
git fetch origin master
git merge origin/master
git pull --rebase #以rebase的方式拉取。
33,分支跟踪
解释:某一个本地分支 跟踪 某一个远程分支。
git clone后,本地master分支会跟踪远程master分支。
Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。
▪git checkout -b <new_branch> <remote/branch> 新建分支并设置远程跟踪分支
例:git checkout -b branch1 orange/branch1 #本地branch1跟踪远程branch1.
此时,git pull将直接从远程branch1拉取数据。
▪git branch -u <remote/branch> 在已有的分支上设置远程跟踪分支
▪git branch -vv 显示所有分支 并显示是否存在远程跟踪分支
34,ssh key秘钥
ssh的方式拉取远程代码,配置后操作不再需要输入用户名密码。
命令:ssh-keygen -t rsa -C "email"
▪生成sshkey 在~/.ssh/id_rsa.pub
▪把id_rsa.pub里面的内容拷贝到相应的代码管理工具的Add new sshkey
※加入ssh key后 push代码的时候不需要输入github账户名密码。
35,git clone扩展
git clone的实际动作如下:
①创建新目录
②git init
③git remote add origin "git clone后面的url"
④git fetch #拉取远程仓库的所有内容
⑤git checkout -b master origin/master #新建本地master跟踪origin/master
36,git远程操作
37,git blame <file> (责备)
使用场景:
当我们想看某一文件的某一行的出处时,就可以使用git blame
例:git blame file.cc
38,git bisect (二分查找)
git bisect start 开始查找
git bisect good <commit id> 开始时 标记好的commit
git bisect bad <commit id> 开始时 标记有问题的commit
git bisect good/bad 查找时 标记是否有问题
git bisect reset 恢复到查找前的状态
39,gitk
历史查看器
sudo apt-get install gitk
40,git gui
提交工具
sudo apt-get install git-gui