Fossil SCM

Now up to 91 reasons.

drh 2026-07-30 20:57 UTC hundred-and-one-reasons
Commit f15daa89a42f396e855a09773466fa9c2650d1d41fba40e9466e78ab46f44d83
1 file changed +89 -1
--- www/hundredandone.md
+++ www/hundredandone.md
@@ -1,8 +1,8 @@
11
# 101 Reasons Why Fossil Is Better Than Git
22
3
-*This is a work in progress. Only 82 reasons have been typed in so far,
3
+*This is a work in progress. Only 91 reasons have been typed in so far,
44
but I have a separate text file of notes that lists 104 candidate reasons.
55
It's just taking me a while to compose and edit the rationale for each
66
one, and to arrange the reasons in a sensible order. I will merge this
77
document from its current branch onto trunk when it gets closer to being
88
ready to publish.*
@@ -214,10 +214,17 @@
214214
GitHub just cannot shows you the checkins of branch setlk-snapshot-fix
215215
only. There are other third-party tools that will show you that, I am
216216
told, but they all require a local clone of the repository. Apparently
217217
there is no way to see this information in a web browser running on
218218
your phone.
219
+
220
+ 1. **Fossil has a built-in bug tracking system.**.<p>
221
+ Tickets are stored in the repository together with source code and
222
+ push/pull/sync the same as the code. The ticket system is configurable
223
+ and distributed. Repository administrators can determine what
224
+ fields appear in tickets and what users are allowed to create,
225
+ edit, or moderate tickets.
219226
220227
1. **Fossil allows multiple branches with the same name.**<p>
221228
This is used, for example, to name a lot for branches "experimental"
222229
or "mistake". See
223230
<https://sqlite.org/src/timeline?r=experimental> and
@@ -862,5 +869,86 @@
862869
<p>
863870
One important aspect of Fossil that this page illustrates due to the
864871
rebust and modular design of the Fossil implementation,
865872
pages like this can be generated, using very little memory or CPU,
866873
and with not very much code.
874
+
875
+ 1. **Fossil allows you to update your current check-out even if it
876
+ contains uncommitted changes.**<p>
877
+ This is a very common idiom in Fossil. You are working on changes
878
+ and somebody commits ahead of you. You just run
879
+ "<tt>fossil&nbsp;up</tt>" ("up" is short for "update") and the new
880
+ external changes are merge into your own uncommitted changes. You
881
+ continue working.
882
+ <p>
883
+ Doing this in Git appears to require multiple commands involving
884
+ the stash and a rebase.
885
+
886
+ 1. **Fossil lets you undo an update.**<p>
887
+ If you run "<tt>fossil&nbsp;up</tt>" on a check-out that contains
888
+ uncommitted changes, and the update does not go well (for example,
889
+ if there are a lot of merge conflicts) you can back out the update
890
+ by running "<tt>fossil&nbsp;undo</tt>".
891
+ <p>
892
+ The need for this does not arise often, because
893
+ "<tt>fossil&nbsp;up</tt>" normally just works. But the ability to
894
+ undo is a nice safety for the rare cases when the update goes awry.
895
+ Current versions of Fossil only support a single level of undo,
896
+ but that might change in the future.
897
+
898
+ 1. **Fossil warns you if you try to commit and somebody else has
899
+ committed and pushed ahead of you.**<p>
900
+ You can then run "<tt>fossil&nbsp;up</tt>" and then retest and retry.
901
+ Or you can override the warning and force Fossil to commit anyhow,
902
+ thus forking the branch. Either way,
903
+ you enter the commit with more knowledge about what is happening,
904
+ and thus improved situational awareness.
905
+
906
+ 1. **Every Fossil project has a unique identifier**.<p>
907
+ When a new repository is created, the unique identifier is created
908
+ and stored in the repository. That identifier is called the
909
+ "project code". The identifier is copied with every
910
+ clone. (Uniqueness is probabilistic. The identifier simply contains
911
+ enough of high-quality randomness to make it unlikely that there
912
+ will ever be a collision.)
913
+ <p>
914
+ It is not possible in Fossil to push to or pull from a repository
915
+ with the wrong project code. Thus you cannot contaminate one
916
+ project with code from another simply by specifying the wrong
917
+ remote and adding the --force flag, as is apparently possible in Git.
918
+
919
+ 1. **Each Fossil repository keeps an audit trail.**<p>
920
+ For each new artifact received into a Fossil repository, by push or
921
+ pull or by direct commit from the command line, Fossil records a
922
+ timestamp, username, and an IP address (where applicable) for
923
+ that artifact. If harmful or malicious is ever introduced into
924
+ a repository, the repository administrator has the capability to
925
+ trace that content back to its source, so that appropriate
926
+ sanctions can be applied to the malefactor.
927
+
928
+ 1. **Fossil stores content in a power-safe ACID database.**<p>
929
+ The repository content cannot be corrupted by a program crash,
930
+ system crash, or unexpected power loss. The repository moves
931
+ from one consistent state to another, atomically. This helps
932
+ to ensure that the resources stored in Fossil are kept safe,
933
+ even if the Fossil implementation itself contains bugs.
934
+ <p>
935
+ The underlying datbase engine used by Fossil is SQLite, of course.
936
+ <p>
937
+ Git also claims to be transactional. However, because Git does
938
+ not use a separate database engine, the transactional integrity
939
+ of Git depends entirely upon the correctness of the Git code
940
+ itself. Git is thus far more sensitive to implementation bugs.
941
+
942
+ 1. **Fossil supports a built-in graphical diff tool.**<p>
943
+ Running "<tt>fossil&nbsp;gdiff</tt>" show the currently
944
+ uncommitted changes in a Tk-based graphical display. This
945
+ is built into Fossil and does not require any external tools
946
+ (though it does require Tcl/Tk). Git requires external tooling
947
+ in order to do the same.
948
+
949
+ 1. **Fossil support showing diffs in a web browser.**<p>
950
+ Adding the "<tt>-b</tt>" or "<tt>-by</tt>" option to any Fossil
951
+ diff command causes that diff to be rendered as a new page in
952
+ the users default web browser. Git does not have any such
953
+ capability, even with the aid of external programs, as far as
954
+ I am aware.
867955
--- www/hundredandone.md
+++ www/hundredandone.md
@@ -1,8 +1,8 @@
1 # 101 Reasons Why Fossil Is Better Than Git
2
3 *This is a work in progress. Only 82 reasons have been typed in so far,
4 but I have a separate text file of notes that lists 104 candidate reasons.
5 It's just taking me a while to compose and edit the rationale for each
6 one, and to arrange the reasons in a sensible order. I will merge this
7 document from its current branch onto trunk when it gets closer to being
8 ready to publish.*
@@ -214,10 +214,17 @@
214 GitHub just cannot shows you the checkins of branch setlk-snapshot-fix
215 only. There are other third-party tools that will show you that, I am
216 told, but they all require a local clone of the repository. Apparently
217 there is no way to see this information in a web browser running on
218 your phone.
 
 
 
 
 
 
 
219
220 1. **Fossil allows multiple branches with the same name.**<p>
221 This is used, for example, to name a lot for branches "experimental"
222 or "mistake". See
223 <https://sqlite.org/src/timeline?r=experimental> and
@@ -862,5 +869,86 @@
862 <p>
863 One important aspect of Fossil that this page illustrates due to the
864 rebust and modular design of the Fossil implementation,
865 pages like this can be generated, using very little memory or CPU,
866 and with not very much code.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
867
--- www/hundredandone.md
+++ www/hundredandone.md
@@ -1,8 +1,8 @@
1 # 101 Reasons Why Fossil Is Better Than Git
2
3 *This is a work in progress. Only 91 reasons have been typed in so far,
4 but I have a separate text file of notes that lists 104 candidate reasons.
5 It's just taking me a while to compose and edit the rationale for each
6 one, and to arrange the reasons in a sensible order. I will merge this
7 document from its current branch onto trunk when it gets closer to being
8 ready to publish.*
@@ -214,10 +214,17 @@
214 GitHub just cannot shows you the checkins of branch setlk-snapshot-fix
215 only. There are other third-party tools that will show you that, I am
216 told, but they all require a local clone of the repository. Apparently
217 there is no way to see this information in a web browser running on
218 your phone.
219
220 1. **Fossil has a built-in bug tracking system.**.<p>
221 Tickets are stored in the repository together with source code and
222 push/pull/sync the same as the code. The ticket system is configurable
223 and distributed. Repository administrators can determine what
224 fields appear in tickets and what users are allowed to create,
225 edit, or moderate tickets.
226
227 1. **Fossil allows multiple branches with the same name.**<p>
228 This is used, for example, to name a lot for branches "experimental"
229 or "mistake". See
230 <https://sqlite.org/src/timeline?r=experimental> and
@@ -862,5 +869,86 @@
869 <p>
870 One important aspect of Fossil that this page illustrates due to the
871 rebust and modular design of the Fossil implementation,
872 pages like this can be generated, using very little memory or CPU,
873 and with not very much code.
874
875 1. **Fossil allows you to update your current check-out even if it
876 contains uncommitted changes.**<p>
877 This is a very common idiom in Fossil. You are working on changes
878 and somebody commits ahead of you. You just run
879 "<tt>fossil&nbsp;up</tt>" ("up" is short for "update") and the new
880 external changes are merge into your own uncommitted changes. You
881 continue working.
882 <p>
883 Doing this in Git appears to require multiple commands involving
884 the stash and a rebase.
885
886 1. **Fossil lets you undo an update.**<p>
887 If you run "<tt>fossil&nbsp;up</tt>" on a check-out that contains
888 uncommitted changes, and the update does not go well (for example,
889 if there are a lot of merge conflicts) you can back out the update
890 by running "<tt>fossil&nbsp;undo</tt>".
891 <p>
892 The need for this does not arise often, because
893 "<tt>fossil&nbsp;up</tt>" normally just works. But the ability to
894 undo is a nice safety for the rare cases when the update goes awry.
895 Current versions of Fossil only support a single level of undo,
896 but that might change in the future.
897
898 1. **Fossil warns you if you try to commit and somebody else has
899 committed and pushed ahead of you.**<p>
900 You can then run "<tt>fossil&nbsp;up</tt>" and then retest and retry.
901 Or you can override the warning and force Fossil to commit anyhow,
902 thus forking the branch. Either way,
903 you enter the commit with more knowledge about what is happening,
904 and thus improved situational awareness.
905
906 1. **Every Fossil project has a unique identifier**.<p>
907 When a new repository is created, the unique identifier is created
908 and stored in the repository. That identifier is called the
909 "project code". The identifier is copied with every
910 clone. (Uniqueness is probabilistic. The identifier simply contains
911 enough of high-quality randomness to make it unlikely that there
912 will ever be a collision.)
913 <p>
914 It is not possible in Fossil to push to or pull from a repository
915 with the wrong project code. Thus you cannot contaminate one
916 project with code from another simply by specifying the wrong
917 remote and adding the --force flag, as is apparently possible in Git.
918
919 1. **Each Fossil repository keeps an audit trail.**<p>
920 For each new artifact received into a Fossil repository, by push or
921 pull or by direct commit from the command line, Fossil records a
922 timestamp, username, and an IP address (where applicable) for
923 that artifact. If harmful or malicious is ever introduced into
924 a repository, the repository administrator has the capability to
925 trace that content back to its source, so that appropriate
926 sanctions can be applied to the malefactor.
927
928 1. **Fossil stores content in a power-safe ACID database.**<p>
929 The repository content cannot be corrupted by a program crash,
930 system crash, or unexpected power loss. The repository moves
931 from one consistent state to another, atomically. This helps
932 to ensure that the resources stored in Fossil are kept safe,
933 even if the Fossil implementation itself contains bugs.
934 <p>
935 The underlying datbase engine used by Fossil is SQLite, of course.
936 <p>
937 Git also claims to be transactional. However, because Git does
938 not use a separate database engine, the transactional integrity
939 of Git depends entirely upon the correctness of the Git code
940 itself. Git is thus far more sensitive to implementation bugs.
941
942 1. **Fossil supports a built-in graphical diff tool.**<p>
943 Running "<tt>fossil&nbsp;gdiff</tt>" show the currently
944 uncommitted changes in a Tk-based graphical display. This
945 is built into Fossil and does not require any external tools
946 (though it does require Tcl/Tk). Git requires external tooling
947 in order to do the same.
948
949 1. **Fossil support showing diffs in a web browser.**<p>
950 Adding the "<tt>-b</tt>" or "<tt>-by</tt>" option to any Fossil
951 diff command causes that diff to be rendered as a new page in
952 the users default web browser. Git does not have any such
953 capability, even with the aid of external programs, as far as
954 I am aware.
955

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button