1、基本命令
目录
使用 SSH 连接到远程存储库时出现“Permission denied (publickey)”错误
创建 Git 存储库
$ git init
添加文件/目录到索引
$ git add <filepattern>
-p
选项,系统将提示您接受/拒绝已更改文件的特定部分。
-i
选项,则可以交互式地暂存更改
将更改提交到本地存储库
$ git commit
-a
选项就像一个快捷方式,可以检测更改的文件 (新添加的文件除外),将它们添加到索引, 并提交它们。
-m
选项允许您同时提交和指定提交消息。如果您不指定-m
,将打开一个文本编辑器,提示您输入提交消息。
撤消上一次提交的更改
$ git revert HEAD
Git revert 命令将一个提交作为参数,并创建一个新的提交来撤消该提交所做的更改。
显示工作树状态
$ git status
添加-s
选项将只显示已更改的文件名。
添加-s
选项,后面再接-b
选项,将在输出中包含分支名称
显示对工作树和索引的更改
$ git diff
在默认情况下,diff
命令将会显示工作树和索引之间的差异。
如果添加--cached
选项,将显示索引和 HEAD
之间的差异。
如果您指定提交哈希,将会显示工作树和当前的 HEAD/
提交之间的差异
显示提交日志
$ git log
显示提交详细信息
$ git show <commit>
重命名文件
$ git mv <oldfilename> <newfilename>
从工作树和索引中移除文件
$ git rm <file>
从工作树中移除未跟踪文件
$ git clean
添加-n
选项将只显示将要移除的文件。添加-f
选项实际上会移除文件
将文件恢复到工作树
$ git checkout -- <file>
从索引中移除文件
$ git reset HEAD -- <file>
仅将修改和删除的文件添加到索引
$ git add -u
2、远程命令
复制存储库
$ git clone <url>
克隆命令将在本地计算机上创建现有远程存储库的副本。它还将配置本地存储库以自动跟踪远程存储库。
该配置允许您执行 Git push 命令或 Git fetch/pull 命令而不指定远程存储库名称
添加远程存储库
$ git remote add <name>
显示远程存储库列表
$ git remote
如果添加-v
选项,您就可以查看远程存储库的详细信息
从远程存储库签出分支
$ git checkout <branch>
创建分支更改并将其推送到远程存储库
$ git push <repository> <refspec>
检查远程存储库中的分支更改
$ git fetch <repository> <refspec>
获取命令允许您从远程存储库检索最新数据,以检查更改的内容。但是,此命令不会自动将更改合并到您现有的任何工作中。
repository
和refspec
参数都是可选的。省略存储库名称将产生与推送命令相同的操作。省略refspec
参数将确保获取可应用于该远程存储库中的所有分支
从远程存储库获取并合并最新的分支更改
$ git pull <repository> <refspec>
pull 命令将从远程存储库中检索最新更改的内容,并将其直接合并到您的本地存储库中。基本上,pull = fetch + merge
。
repository
和refspec
参数都是可选的。省略存储库名称将产生与推送命令相同的操作。省略refspec
参数将确保拉取仅应用于当前分支。
从远程存储库删除分支
$ git push --delete <repository> <branchname>
删除远程存储库中的分支。
在推送命令中加入--delete
选项,从远程存储库中删除指定的分支
在远程存储库中创建标签
$ git push <repository> <tagname>
如果添加--tags
选项,则本地存储库中存在的所有标签都将被推送到远程存储库中,并与您指定的任何符号引用一起在远程存储库中创<tagname>
从远程存储库删除标签
$ git push --delete <repository> <tagname>
使用推送命令的--delete
选项可以从远程存储库中删除指定的标签。
修改远程存储库地址
$ git remote set-url <name> <newurl>
重命名远程存储库
$ git remote rename <old> <new>
3、git的分支命令
显示分支列表
$ git branch
添加-r
选项还将列出远程跟踪分支。添加-a
选项将同时显示远程和本地分支
创建分支
$ git branch <branchname>
重命名分支
$ git branch -m <oldbranch> <newbranch>
删除分支
$ git branch -d <branchname>
如果该分支还没有完全与上游分支合并,或者在 HEAD
中如果没有上游,Git 将不允许您删除该分支。但是,您可以指定-D
以强制删除它,而不管其合并状态如何。
切换分支
$ git checkout <branch>
添加-b
选项将创建一个新分支,并切换到它
合并分支
$ git merge <branch>
添加--no-ff
选项将导致 git merge
命令都会是创建合并提交,而不是快进。这很有用,因为它允许您保留合并前分支的历史记录信息。
当您添加--squash
选项时,Git 会创建一个代表合并更改的单个提交,而不是创建合并提交。 此提交包含来自合并分支的更改,但不包含任何与合并分支或合并过程本身相关的信息
4、提交历史记录
修改之前的提交和消息
$ git commit --amend
添加--amend
选项来覆盖您正在处理的分支的最新提交。
当索引中没有文件时,您可以通过添加--amend
选项重新提交之前的提交,系统将提示您编辑现有的提交消息。
修改并移动过去的提交和消息
$ git rebase -i <commit>
添加提交哈希,将列出直到最新提交的所有提交的列表。找到您要修改的提交,并将该行从pick
更改为edit
,然后保存并退出。
接下来,添加--amend
选项来提交。将显示用于添加消息的界面。修改消息。
$ git commit --amend
最后,添加--continue
选项来运行 rebase。
$ git rebase --continue
退出变基
$ git rebase --abort
通过添加--abort
选项,您可以退出变基操作。
显示参考日志
$ git reflog
显示分支提示的参考日志
$ git reflog <ref>
移除以前的提交
$ git reset --hard HEAD~
重置变基
$ git reset --hard <commit>
取消之前的重置
$ git reset --hard ORIG_HEAD
ORIG_HEAD
指的是重置发生之前的提交。您可以使用 reset to ORIG_HEAD
恢复之前的重置
从另一个分支复制提交
$ git cherry-pick "<commit>"
搜索提交消息
$ git log --grep "<pattern>"
5、Git 暂存命令
暂存当前的更改
$ git stash save
显示暂存列表
$ git stash list
从暂存中恢复更改
$ git stash pop
删除暂存
$ git stash drop
删除所有暂存
$ git stash clear
6、标签命令
显示标签列表
$ git tag
添加-n
选项将显示每个标签上的注释
创建标签
$ git tag <tagname>
创建带有信息的标签
$ git tag -a <tagname>
删除标签
$ git tag -d <tagname>
7、Git config 命令
设置用户名和电子邮件
$ git config --global user.name <username>
$ git config --global user.email <mailaddress>
如果没有--global
选项,此设置将仅应用于特定存储库。
彩色显示输出
$ git config --global color.ui auto
为命令设置别名
$ git config --global alias.<aliasname> <commandname>
从版本控制跟踪中删除文件
$ echo <filename> >> .gitignore
在.gitignore
文件下添加文件路径。Git 将不再管理这些文件。您必须提交.gitignore
文件才能发挥作用
在版本控制下跟踪空目录
$ cd <dirname>
$ touch .gitkeep
Git 不会跟踪空目录。如果您想将其添加到版本控制中,则需要在该目录中放置一个文件。人们通常做的一个常见做法是在空目录中添加一个.gitkeep
文件。
显示设置
$ git config --global --list
设置与代理服务器的 HTTP 连接
将以下设置添加到.gitconfig
文件的 http 项。
[http] proxy = <address of the proxy server>:<port of the proxy server>
也可以使用以下 config 命令对其进行配置:
$ git config --global http.proxy <address of the proxy server>:<port of the proxy server>
建立到用户认证代理服务器的 HTTP 连接
将以下设置添加到.gitconfig
文件的 http 项
[http] proxy = http://<username>:<password>@<address of the proxy server>:<port of the proxy server>
您也可以使用以下 config 命令对其进行配置:
$ git config --global http.proxy http://<username>:<password>@<address of the proxy server>:<port of the proxy server>
8、故障排除
使用 SSH 连接到远程存储库时出现“Permission denied (publickey)”错误
首先,您需要确保以下几点:
- URL 是否正确?
- 密钥是否在本地机器中正确配置?
- 公钥是否在远程正确配置?
您可以通过运行以下命令,来验证与 Backlog 远程存储库对应的公钥/密钥配置:
$ ssh <space>@<space>.git.backlog.com
用您拥有的 Backlog 空间取代<space>
。(例如,对于空间demo.backlog.com
,它将是demo@demo.git.backlog.com
)
如果设置正确,您将看到以下输出。如果您看到错误消息,请重复上述步骤并确保您做对了。
Hi yourname! You've successfully authenticated, but Backlog does not provide shell access. Connection to git.backlog.com closed.
无法通过其 HTTPS URL 克隆远程存储库
在旧版的 Git 上,您可能偶尔会在执行推送或拉取时遇到问题。建议您使用最新的 Git 版本或高于 v2 的版本。如果您使用的是 Source Tree 或 TortoiseGit 等 Git 客户端,请使用相应客户端附带的 Git 版本。
推送到远程存储库的更改没有反映在那里
执行推送时,您可能会遇到以下消息。当您从新的本地存储库推送时,通常会发生这种情况
$ git push
No refs in common and none specified; doing nothing. Perhaps you should specify a branch such as 'main'. Everything up-to-date
通过在执行推送时省略分支名称,Git 将默认假定您正在尝试将当前更改推送到与本地分支同名的远程分支。如果尚未在远程存储库中创建主分支,则会发生这种情况。(我们从本地主分支推送。)在这种情况下,我们将必须在执行推送时明确使用分支名称。
$ git push -u origin main
通过这样做,主分支将自动在远程存储库中创建。您下次运行推送时,可以省略分支名称。
9、Git 与 SVN 命令
Git-Subversion 命令对照表
Command | Operation | Subversion |
---|---|---|
git clone | 复制存储库 | svn checkout |
git commit | 记录对文件历史记录的更改 | svn commit |
git show | 查看提交详细信息 | svn cat |
git status | 查看状态 | svn status |
git diff | 查看差异 | svn diff |
git log | 查看日志 | svn log |
git add | 添加 | svn add |
git mv | 移动 | svn mv |
git rm | 删除 | svn rm |
git reset | 取消更改 | svn revert1 |
git branch | 创建分支 | svn copy2 |
git checkout | 切换分支 | svn switch |
git merge | 合并 | svn merge |
git tag | 创建标签 | svn copy2 |
git pull | 更新 | svn update |
git fetch | 更新 | svn update |
git push | 反映在远程的更改 | svn commit3 |
.gitignore | 忽略文件列表 | .svnignore |
- SVN 中的 Revert 取消更改,但 Git 中的 Revert 否定更改。
- 分支和标签在 SVN 中相同,但在 Git 中不同。
- SVN 没有本地存储库与远程存储库的概念;因此,提交直接反映在远程中。