文章目录
参考
首先,我按照廖雪峰的Git教程学习,将教程中的各种命令实践了一遍,并记录了下来,但比较杂乱;然后发现了阮一峰总结的清单,分类清楚,也很实用,借鉴一下,我也按照他的分类将我学习的整理一份,也将各个命令亲手再打一遍再熟悉一下,大家可以直接看他的,比较全。
Git工作流程
(图片摘自阮一峰的网络日志《常用Git命令清单》)
相关概念
名词 | 含义 |
---|---|
Workspace | 工作区 |
Stage/index | 暂存区 |
Repository | 本地仓库 |
Remote | 远程仓库 |
名词 | 含义 |
---|---|
add | 1.跟踪文件 2.将已跟踪文件更新保存到暂存区(只保存当前版本,继续修改后,需要再次add才能把最新修改保存到暂存区) 3.合并时将冲突文件标记为已解决状态 |
commit | 提交暂存区文件到本地仓库 |
push | 推送本地仓库更新到远程仓库 |
fetch | 获取远程仓库最新代码到本地仓库,不会自动merge |
clone | 克隆远程仓库代码副本到本地仓库 |
pull | 拉取远程仓库代码更新到本地仓库,自动merge |
checkcout | 切换分支、丢弃文件更新 |
常用命令
1. 新建
命令 | 功能 |
---|---|
git init | 初始化目录为git管理的仓库 |
git init dirName | 创建目录,并初始化为git管理的仓库 |
git clone remoteUrl | 根据远程仓库的地址SSH / HTTPS,将远程仓库克隆到本地,包括所有代码历史记录 |
2. 配置
命令 | 功能 |
---|---|
git config | 查看config相关命令 |
git config --list | 查看自己的git配置 |
git config [–global] [–local] user.name your name | 配置提交代码时的用户名,加上–global是配置全局的,所有仓库都能使用,在用户目录中生成配置文件.gitconfig; 不加或local,只在当前仓库可用,在.git中生成配置文件config |
git config [–global] user.email your email | 配置用户邮箱 |
git config [–global] color.ui true/false | 配置命令行显示颜色 |
git config [–global] alias.alias name git command name | 配置别名, 例如git config --global alias.st status , 之后git st == git status 。 修改别名,可以直接通过命令重新设置覆盖;也可在配置文件中直接修改 |
3. 查看
命令 | 功能 |
---|---|
git status | 查看仓库当前状态,显示变更的文件 |
git log | 查看仓库提交历史记录,显示版本号、提交人,日期,修改内容 |
git log -2 | 查看2次仓库提交历史记录 |
git log filePath | 查看某个文件的提交历史记录 |
git log --pretty=oneline | 查看仓库提交历史记录,一行显示版本号、修改内容 |
git log --stat | 显示commit历史,以及每次commit发生变更的文件 |
git log --graph | 查看合并分支图 |
git reflog | 能够记录几乎所有本地仓库的改变。 包括所有分支commit提交,已经删除(其实并未被实际删除)commit都会被记录。 总结:只要HEAD发生变化,就可以通过reflog查看到。 |
git diff | 显示工作区和暂存区的差异 |
git diff --cached | 显示暂存区和最新commit的差异 |
git diff HEAD | 显示工作区和最新commit的差异 |
git diff filePath | 同git diff , 只是查看具体file的差异 |
cat filePath | 查看文件内容 |
4. 增删
命令 | 功能 |
---|---|
git add file file | 添加文件到暂存区,可以添加多个。 如果手动删除文件,然后git add 和 git rm效果相同 |
git add -f file | 强制添加文件到暂存区(被忽略的文件) |
git add dir dir | 添加目录到暂存区,包括子目录,可以添加多个 |
git add . | 添加所有文件到暂存区 |
git rm flie file | 从工作区删除文件,并将这次删除操作放入暂存区 |
git rm --cached file | 对某个文件取消跟踪,但不删除 |
git rm --f file | 对某个文件取消跟踪并删除 |
git mv oldFile newFile | 修改文件名,并放入暂存区 |
5. 提交
命令 | 功能 |
---|---|
git commit -m “log ” | 提交暂存区文件到仓库,添加提交日志 |
git commit file file -m “log ” | 提交暂存区指定文件到仓库,添加提交日志 |
git commit --amend -m “updateLog ” | 修改最近一次的提交日志 |
6. 分支
命令 | 功能 |
---|---|
git branch | 列出本地分支 |
git branch -r | 列出远程分支 |
git branch -a | 列出本地和远程所有分支 |
git branch branchName | 创建本地分支 |
git checkout branchName | 切换分支 |
git checkout -b branchName | 创建本地分支,并切换到该分支 |
git checkout -b branchName remoteBranchName | 创建本地分支,并切换到该分支,并与远程分支建立关联 |
git branch -d branchName | 删除本地分支 |
git branch -D branchName | 强制删除本地分支(未合并) |
git merge branchName | 合并某分支到当前分支 |
git cherry-pick commitId | 将其他分支的commitId对应的提交,复制到当前分支,自动提交 |
git branch --set-upstream-to branchName origin/branchName | 本地分支和远程分支建立关联 |
git push --set-upstream remote remoteBranchName | 创建远程分支 |
git push --delete remote remoteBranchName | 删除远程分支 |
7. 标签
命令 | 功能 |
---|---|
git tag | 查看标签 |
git show tagName | 查看标签信息 |
git tag tagName \git tag tagName commitId | 根据最近一次提交新建本地标签\根据commitID新建本地标签 |
git tag -a tagName -m log | 可以指定标签信息 |
git tag -d tagName | 删除本地标签 |
git push remote tagName | 标签推送到远程仓库 |
git push remote --tags | 所有标签推送到远程仓库 |
git push remote :refs/tags/tagName | 删除远程仓库标签 |
8. 远程
命令 | 功能 |
---|---|
git remote | 查看连接的远程库 |
git remote -v | 查看所有远程库详细信息 |
git remote show remote | 查看某个远程库的信息 |
git remote removeremote | 删除和远程库的关联 |
git remote add customRemoteName git@github.com:githubUserName /repositoryName .git | 本地仓库和远程GitHub仓库建立关联 |
git remote add customRemoteName git@gitee.com:giteeUserName /repositoryName .git | 本地仓库和码云远程库建立关联 |
git pull remoteName branch | 拉取远程分支,与本地分支合并 |
git push remoteName branch | 推送当前分支到远程分支 |
git push -u remoteName branchName | 创建新的远程分支,推送当前分支文件到远程分支,并建立关联 |
9. 暂存
命令 | 功能 |
---|---|
git stash | 暂时将未提交的变化保存到堆栈,工作区恢复为干净的 |
git stash list | 查看有哪些保存的工作现场 |
git stash pop | 将最近一次stash从堆栈弹出,恢复到工作区。该次储藏相当于从堆栈移除 |
git stash apply stash@{xxx} | 将某个储藏的工作现场恢复到工作区,该次储藏不会被移除 |
git stash drop stash@{xxx} | 删除某个储藏记录 |
git stash clear | 清空所有储藏记录 |
git show stash@{1} | 查看某个stash内容 |
不消息误删了stash,怎么办?
删除后会有提示删除成功,其中会有对应的引用id,如下:
Dropped stash@{2} (4ee684a3c8624a81a12b686084703c464bfe6391)
如果找不到了,可以通过:git fsck –lost-found
命令查找最近的删除操作,如
dangling commit 4ee684a3c8624a81a12b686084703c464bfe6391
dangling commit 6526a83302e9673311b73fa87d935bc7cf276c05
dangling commit ff27285e444add9c18bf1f2d8b6c24cd8d540bc6
dangling commit 3f3a8ca1e4d3c2c3a9a6e62391a0514aa7e5d668
我们只关注 commit
的,通过git show e106b0b9ba4220832435ca4be727d317fe43c722
去查看这个暂存的日志、时间、内容等,如果是我们要找的stash ,可以通过git stash apply e106b0b9ba4220832435ca4be727d317fe43c722
来恢复这个stash
10.撤销
命令 | 功能 |
---|---|
git reset --hard commit id | 版本穿越,直接指定版本号,注意:–hard 不会保留两个版本之间所有改动。 既然叫版本穿越,即不只是可以回退到以前的版本,回退之后,还可以根据版本号再穿越回回退之前的版本 |
git reset --soft HEAD^ | –soft 只是回退提交到暂存区,可以保留两个版本之间的改动。 HEAD表示当前分支的当前版本,HEAD^ 回退到上个版本,HEAD^^ 上上个版本,HEAD~100上一百个版本 |
git reset HEAD filePath | 将文件从暂存区撤回到工作区 |
git reset HEAD . | 同上, . 代表所有文件 |
git checkout – filePath | 丢弃工作区中该文件的改动, 恢复到最近一次add 或 commit 时的状态。–是两个-,且前后有空格 。 虽然不加–也可以,但加上更标准,而且不加–是另一个切换分支的命令 |
git checkout – . | 同上, . 代表所有文件 |
11. 其他
命令 | 功能 |
---|---|
ssh-keygen -t rsa -C “your email ” | 输入后一直回车,在用户目录.ssh中创建ssh key 。 id.rsa 是私钥 ,id_rsa.pub 是公钥,私钥保密公钥公开。 远程仓库设置了你的SSH公钥,才支持通过SSH协议传输代码 第一次连接需要确认,根据提示输入yes,回车即可 |
忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。
创建:
- 本地仓库新建
name
.gitignore文件 - 在这里可以找到自己需要的忽略文件,复制到自己的
name
.gitignore文件中,并另存为.gitignore,删除原先的name
.gitignore文件 - 加入版本管理,上传到远程库
规则:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(*) 表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z , a/b/z 或 a/b/c/z 等。
我们再看一个 .gitignore 文件的例子:
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
常用套路
1. 提交代码
- git status 查看本地更新
- git stash 暂存工作现场
- git pull --rebase 拉取最新代码
- git stash pop 恢复工作现场,有冲突解决冲突
- git commit 提交代码到本地仓库,添加日志
- git push 推送本地仓库代码到远程仓库
这是我在AS中直接使用自带的git工具一般操作方法,应该是比全用命令行少一步git add , 因为创建新文件时As会提示是否跟踪文件,确认就算是git add 了.
这样提交代码会减少冲突,另外减少垃圾日志
2. 提交失败
! [remote rejected] **** -> ***** (change ×××× closed)
原因:push 成功,没有成功 merge 到远程分支,被废弃。可以通过As > vcs > git > push ,查看到提交的记录,正常merge后记录会清空掉。
解决:
- git log 查看提交记录
commit 1234 本次提交
commit 1235 merge失败记录 1
commit 1236 merge失败记录 2
commit 1237 merge成功记录
- git reset --soft 1237 回退到1237那个节点,也是撤销掉1235和1236两次提交,并且不会删除之间的代码改动
- git commit 重新提交本次需要提交的代码
- git push 推送到远程仓库
3. 本地和远程偏离
碰到了偏离,更新代码下来太多冲突,在自己修改的代码已经提交到一个分支的情况下,使用了以下方法:
- git fetch --all 获取该分支所有最新代码,不合并
- git reset --hard origin/xxxxx(远程分支名) 本地代码同步线上最新代码,即用线上代码覆盖本地代码
4. git修改密码之后,拉取代码报错remote: HTTP Basic: Access denied,fatal: Authentication failed for……
git config --system --unset credential.helper
git config --global credential.helper store
分别执行上面两条命令后,重新拉取就会让你重新输入用户名和密码,输入正确后拉取成功,后面就都可以了
暂时先记录到这里,暂时记录的都是自己尝试过的基础的命令,后面学习中,不断再更新吧