git命令详解
本文md文档下载地址
https://download.youkuaiyun.com/download/a254939392/89503768
git工作区、暂存区、本地仓库、远程仓库
工作区–>git add->暂存区(stage/index)–>git commit–>本地库–>git push–>远程仓库
从远程clone 项目
输入账号密码
git clone https://github.com/1715656022/spring-me.git
Cloning into 'spring-me'...
Username for 'https://github.com': 1715656022@qq.com
remote: Enumerating objects: 271, done.
remote: Counting objects: 100% (271/271), done.
remote: Compressing objects: 100% (191/191), done.
remote: Total 271 (delta 68), reused 253 (delta 56), pack-reused 0
Receiving objects: 100% (271/271), 97.80 KiB | 227.00 KiB/s, done.
Resolving deltas: 100% (68/68), done.
git checkout
git checkout命令用于切换分支或恢复工作树文件。
git checkout`是git最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区
#取出master版本的head
$ git checkout master
#在当前分支上 取出 tag_name 的版本
$ git checkout tag_name
#放弃当前对文件file_name的修改
$ git checkout master file_name
#取文件file_name的 在commit_id是的版本。commit_id为 git commit 时的sha值
$ git checkout commit_id file_name
Git 运行配置
git config --global user.name <your name>
git config --global user.email <your_email@example.com>
git config --global push.default simple
git config --global core.quotepath false
git config --global core.editor /usr/bin/vim
git config --global credential.helper store
git config --global credential.helper wincred
git config --global core.ignorecase false
user.name;设置你的称呼;
user.email;设置你的邮箱;
查看所有的(name.key)/(value)
$ git config -l
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslbackend=openssl
http.sslcainfo=D:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
user.name=java_1715656022
user.email=1715656022@qq.com
filter.lfs.required=true
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
credential.helper=store
core.quotepath=false
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=https://github.com/1715656022/spring-me.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
其他配置
git config -unset;Remove the line matching the key from config file.
git config -unset-all:Remove all lines matching the key from config file.
git config --global core.quotepath false:解决 Windows Git Bash、Linux 下的中文转码问题;
git config --global core.editor /usr/bin/vim:OS X 下 merge 命令 vi error 问题;通常 core.editor=vim。
git config --global credential.helper wincred:Win Git Bash 启用 http/https 协议时设置。
git config --global core.ignorecase false
设置大小写敏感,保持 Mac/Win/Linux一致性;在目录名大小写修改时,git可正常提交;
解决 CRLF 问题的通常做法
错误示例:
$ git add README.md
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory
window下:
git config --global core.autocrlf true
Linux & Mac
git config --global core.autocrlf input
解决 Windows Git Bash、Linux 下的中文转码问题
git config --global core.quotepath false
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
"git\345\221\275\344\273\244.md"
参考:https://www.jianshu.com/p/f29ca723db4f
git remote 命令的用法
#查看关联的远程仓库的名称
git remote
# 查看关联的远程仓库的详细信息
git remote -v
origin https://github.com/1715656022/spring-me.git (fetch)
origin https://github.com/1715656022/spring-me.git (push)
远程仓库的名称一般默认为 origin ,当然,你可以设置为其他的名称
通过 git clone 下载项目到本地时,项目文件夹中的 .git 目录就是版本库目录。
.git 目录中的 config 文件中有远程仓库的关联配置。
git status 命令 工作区 暂存区
查看本地工作区、暂存区中文件的修改状态
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md #本地修改并且git add
new file: dddd #本地新增并且git add
deleted: delete_test #本地删除并且git add
Untracked files:
(use "git add <file>..." to include in what will be committed)
test
#绿色:本地磁盘数据,作者修改README.md 已经git add
#红色:test 为新建的文档,并未add
$ ll
total 2
-rw-r--r-- 1 Lenovo 197121 20 9月 17 12:59 README.md
-rw-r--r-- 1 Lenovo 197121 13 9月 17 12:59 test
git log 提交历史查询
$ git log
commit 5f3ce7c6eb63db202b05f89ada07e1efe6c0ca76 (HEAD -> master)
Author: java_1715656022 <1715656022@qq.com>
Date: Tue Sep 17 14:12:59 2019 +0800
test1sdsdsssssssssssssssssssssssss
commit 005cf5508ed2c3de995c59c7c7fa0d028a5962da (origin/master, origin/HEAD)
Author: java_1715656022 <1715656022@qq.com>
Date: Tue Sep 17 13:49:36 2019 +0800
dfd
commit 09a683a406126a57f113580ce74ab16a4ad3850e
Author: java_1715656022 <1715656022@qq.com>
Date: Tue Sep 17 13:46:49 2019 +0800
adfs
commit 78bd1b429b42e682b65ca4cc0bd748333c921efb
Author: 1715656022 <1715656022@qq.com>
Date: Tue Sep 17 12:55:40 2019 +0800
Initial commit
git log
会按提交时间列出所有的更新,最近的更新排在最上面。看到了吗,每次更新都有一个 SHA-1 校验和、作者的名字和电子邮件地址、提交时间,最后缩进一个段落显示提交说明。
-p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新
git log -p -2
commit 5f3ce7c6eb63db202b05f89ada07e1efe6c0ca76 (HEAD -> master, origin/master, origin/HEAD)
Author: java_1715656022 <1715656022@qq.com>
Date: Tue Sep 17 14:12:59 2019 +0800
test1sdsdsssssssssssssssssssssssss
diff --git a/README.md b/README.md
index a65b706..0fd31a2 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-sfdsdfssdfsdfd# mytestgit
+sfdsdfssdfsdsfdsdfsdfd# mytestgit
diff --git a/dddd b/dddd
new file mode 100644
index 0000000..e10e63c
--- /dev/null
+++ b/dddd
@@ -0,0 +1 @@
+sdfsfsa
按条件筛取
#按人查询:
git log --author=username
#按关键词查询
git log --grep=keyword
#按文件查询:
$ git log -- ViewModel/TableViewCell.m
#按分支/Tag/远程分支查询:
$ git log branch_name/tag/remote_branch_name
git add 新增到暂存区
#. 增加当前目录所有文件
git add .
#增加具体单文件
git add README.md
#增加具体多文件
git add README.md README2.md README3.md
#增加文件夹
git add foldname
git reflog
可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
$ git reflog
fd34c9a (HEAD -> master) HEAD@{0}: commit (merge): gi d
b7f22a1 HEAD@{1}: reset: moving to b7f22a11657b62f246ec9bdc506f028a51e778a6
b7f22a1 HEAD@{2}: commit: 222222222
adbb400 HEAD@{3}: commit: dd
5f3ce7c HEAD@{4}: commit: test1sdsdsssssssssssssssssssssssss
005cf55 HEAD@{5}: commit: dfd
09a683a HEAD@{6}: commit: adfs
78bd1b4 HEAD@{7}: clone: from https://github.com/1715656022/mytestgit.git
git reset 撤销
放弃修改,同步运程仓库,回退以前某个版本
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
#reset 三种类型
git reset [--soft | --mixed | --hard
--mixed :会保留源码,只是将git commit和index 信息回退到了某个版本.
git reset 默认是 --mixed 模式
git reset --mixed 等价于 git reset
--soft : 保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可
--hard : 源码也会回退到某个版本,commit和index 都回回退到某个版本.(注意,这种方式是改变本地代码仓库源码)
#实例:放弃所有修改,完全同步运程仓库
git reset --hard origin/master
1 git add 后并未commit 。
#从暂存区撤销README.md文件
git reset HEAD README.md
#撤销到修改前
git checkout -- README.md
2 git commit后撤销
git log
commit fd34c9a1b73ecb43d8b74ded5351d412c5675723 (HEAD -> master)
Merge: b7f22a1 a69551c
Author: java_1715656022 <1715656022@qq.com>
Date: Wed Sep 18 10:23:21 2019 +0800
注释
commit b7f22a11657b62f246ec9bdc506f028a51e778a6
Author: java_1715656022 <1715656022@qq.com>
Date: Tue Sep 17 19:45:24 2019 +0800
# git reset --hard commitid进行回退
git reset --hard fd34c9a1b73ecb43d8b74ded5351d412c5675723
对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令
revert
git revert用于反转提交,执行evert命令时要求工作树必须是干净的.
git revert用一个新提交来消除一个历史提交所做的任何修改.
revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题)
revert 使用,需要先找到你想回滚版本唯一的commit标识代码,可以用 git log 或者在adgit搭建的web环境历史提交记录里查看.
git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61
通常,前几位即可
git revert c011eb3
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
看似达到的效果是一样的,其实完全不同.
第一:
上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会.
第二:
如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.
第三:
reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.
git rebase 合并多次commit
使用 git rebase 合并多次commit。 当你提交的代码后,管理员发现,您的代码不能提交到服务器上,主要原因在于,你的commit 中和服务器中的有些commit不再同一时间轴上,即:你的有些commit要插入到服务器中的某些commit之间,这样就会造成代码的冲突。所以这个时候就要使用git rebase。
1.1 使用 git log 查看历史提交记录
1.2 合并最后四次的提交
git rebase -i HEAD~4
1.3 修改第2-4行的第一个单词pick为squash
1.4 然后保存退出,git会压缩提交历史,如果有冲突,需要修改,修改的时候要注意,保留最新的历史,不然我们的修改就丢弃了
1.5 修改以后要记得敲下面的命令
git add .
git rebase --continue
1.6 如果你想放弃这次压缩的话,执行以下命令:
git rebase --abort
git show 命令 查看 hashid log详情
git show
命令同git log -p
输出类似,只不过它只显示一个commit的内容,如果不指定commit hash, 它默认输出HEAD指向commit的内容.
使用示例:
$ git show 78bd1b429b42e682b65ca4cc0bd748333c921efb #来源git log hash
commit 78bd1b429b42e682b65ca4cc0bd748333c921efb
Author: 1715656022 <1715656022@qq.com>
Date: Tue Sep 17 12:55:40 2019 +0800
Initial commit
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5071953
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# mytestgit
$ git log
commit 5f3ce7c6eb63db202b05f89ada07e1efe6c0ca76 (HEAD -> master, origin/master, origin/HEAD)
Author: java_1715656022 <1715656022@qq.com>
Date: Tue Sep 17 14:12:59 2019 +0800
test1sdsdsssssssssssssssssssssssss
commit 005cf5508ed2c3de995c59c7c7fa0d028a5962da
Author: java_1715656022 <1715656022@qq.com>
Date: Tue Sep 17 13:49:36 2019 +0800
dfd
commit 09a683a406126a57f113580ce74ab16a4ad3850e
Author: java_1715656022 <1715656022@qq.com>
Date: Tue Sep 17 13:46:49 2019 +0800
adfs
commit 78bd1b429b42e682b65ca4cc0bd748333c921efb
Author: 1715656022 <1715656022@qq.com>
Date: Tue Sep 17 12:55:40 2019 +0800
Initial commit
git diff 比较文件差异
#git diff [文件名] , 将工作区中的文件和暂存区进行比较
$ git diff README.md
diff --git a/README.md b/README.md
index e1089ab..168e976 100644
--- a/README.md
+++ b/README.md
#可以查看工作区和版本库的差别
$ git diff head
diff --git a/README.md b/README.md
index e1089ab..168e976 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
-qqw1111111esdfsadfsa
+qqw1111111esdfsadfs
+22222222222a
#可以查看工作区和版本库的差别
$ git diff head
diff --git a/README.md b/README.md
index e1089ab..168e976 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
-qqw1111111esdfsadfsa
+qqw1111111esdfsadfs
+22222222222a
#比较的是暂存区和版本库的差别
$ git diff --cached
分支操作
列出本地所有分支
$ git branch
* master
#注意:当前所在的分支会被星号标示出来
查看项目分支(包括本地和远程)
$ git branch -a
master
my-branch-nv
* my-chanch-1
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/my-chanch-1
创建本地库新分支
$ git branch my-branch-nv
#查看
$ git branch
* master
my-branch-nv
删除本地库指定分支
$ git branch -d my-branch-nv
Deleted branch my-branch-nv (was c1e6429).
删除远程库分支
# git push origin --delete 分支名称
$ git push origin --delete my-branch-nv
To https://github.com/1715656022/mytestgit.git
- [deleted] my-branch-nv
切换分支
# git checkout 分支名称
$ git checkout my-branch-nv
Switched to branch 'my-branch-nv'
M README.md
$ git branch
master
* my-branch-nv
#删除异常情况
$ git branch -D my-branch-nv
error: Cannot delete branch 'my-branch-nv' checked out at 'D:/test/mytestgit'
必须要切换到其他分支或者master分支去删除此分支
提交本地分支到远程库
# git push origin 分支名称
$ git push origin my-branch-nv
Enumerating objects: 28, done.
Counting objects: 100% (28/28), done.
Delta compression using up to 8 threads
Compressing objects: 100% (14/14), done.
Writing objects: 100% (24/24), 1.65 KiB | 338.00 KiB/s, done.
Total 24 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
remote:
remote: Create a pull request for 'my-branch-nv' on GitHub by visiting:
remote: https://github.com/1715656022/mytestgit/pull/new/my-branch-nv
remote:
To https://github.com/1715656022/mytestgit.git
* [new branch] my-branch-nv -> my-branch-nv
分支实战:合并分支到master
1 分支代码提交到远程分支仓库
假如我们现在在dev分支上,刚开发完项目,执行了下列命令
git add .
git commit -m 'dev_commit'
git push -u origin dev
2 切换到master分支上
我们要把dev分支的代码合并到master分支上 该如何?
首先切换到master分支上
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
3 pull 代码master为最新
如果是多人开发的话 需要把远程master上的代码pull下来,保证master为最新的
$ git pull origin master
From https://github.com/1715656022/mytestgit
* branch master -> FETCH_HEAD
Already up to date.
4 我们把dev分支的代码合并到master上
$ git merge dev
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
冲突实战:冲突合并
未完待续
git同时推送到码云和github
git ssh密钥配置
#1 进入~目录
$ cd ~/.ssh
#生成rsa文件
$ ssh-keygen -t rsa -C "254939392@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Lenovo/.ssh/id_rsa):【输入报文文件名称,此处直接回车取默认】
Enter passphrase (empty for no passphrase):【输入密码】
Enter same passphrase again:【输入确认密码】
Your identification has been saved in /c/Users/Lenovo/.ssh/id_rsa.
Your public key has been saved in /c/Users/Lenovo/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vCUk9ryBpnzVckr0zmNxmc5NQl2uR9TOFcjhIHb6FB4 254939392@qq.com
The key's randomart image is:
+---[RSA 2048]----+
| o E..o.=|
| . = =+ +o|
| o o. o...o+|
| . O oo. o oo|
| o S *.= o .|
| . o o % = + . |
| o . + = o . |
| . . . |
| |
+----[SHA256]-----+
#查看ssh key
$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCffc6MTS8VztL/+7Y2uQVRTfPniRH5Ufk7A+MI7/htBZKvf2YpUIc/RV5KtaVHSjiXZSHwPgQZpeOkjxAP8W+mMc0F7mc8mTlZFhT9PdWCGS2abvn2HaaG0bu9cybNFNSpimm6FZ1QdpqfM9NHeu0M2nSxCzK9MNZSRpresOJVxrxeDffPOneh63biS4Hjl1mTjx/i19tSURWWhPcFU84ZzB1cnEM07sAEkU9dPXzIWORbzHKmMCZlnyK5GHryTRiyZH26EP8uX7qsVUBp1fc6m+f/BD8DGYn0ZScdH6Ge+pJLbkvL7h4k+u4oSUgdjwVsNauhOZbGuVgR1nkucSjz 254939392@qq.com
#复制上面的key到github 或者gitee ssh处
#测试是否成功
$ ssh -T git@github.com
The authenticity of host 'github.com (13.250.177.223)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,13.250.177.223' (RSA) to the list of known hosts.
Enter passphrase for key '/c/Users/Lenovo/.ssh/id_rsa':
Hi kfd-bigdata/kfd! You've successfully authenticated, but GitHub does not provide shell access.
#
[root@bigdata kfd]# git push gitee
git 码云 配置同上
修改git配置文件
[root@bigdata kfd]# cd ./.git/
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@github.com:kfd-bigdata/kfd.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[remote "gitee"]
url = git@gitee.com:kfd-bigdata/kfd.git
fetch = +refs/heads/*:refs/remotes/origin/*
推送github
#
[root@bigdata kfd]# git push origin
#
[root@bigdata kfd]# git push
推送码云
#
[root@bigdata kfd]# git push gitee